Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Chronid
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
1

Найти ошибки в коде и исправить эти ошибки - C++

21.09.2016, 17:44. Просмотров 397. Ответов 4
Метки нет (Все метки)

Судя по вываливающейся ошибки, идет двойное освобождение памяти. У самого не получается отловить откуда.

A.h
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
class A
{
private:
    size_t size_;
    char* str_;
    double ab_;
public:
    A(){};
    A(size_t size, char* str, double ab) : size_(size), str_(new char[size + 1]), ab_(ab){
        for (size_t i = 0; i < size_; i++)
            str_[i] = str[i];
        str_[size_] = '\0';
    };
    A(const A&);
    ~A();
    A operator=(const A&);
    void show_();
    friend A operator+(A, A);
};


A.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "A.h"
#include<iostream>
 
A::~A(){ 
    if (str_)
    delete[] str_; 
}
 
A::A(const A& a){
    if (this != &a){
        if (str_)
            delete[] str_;
        size_ = a.size_;
        str_ = new char[size_ + 1];
        for (size_t i = 0; i < size_; i++)
            str_[i] = a.str_[i];
        str_[size_] = '\0';
        ab_ = a.ab_;
    }
}
 
A A::operator=(const A& a){
    if (this != &a){
        if (str_)
            delete[] str_;
        size_ = a.size_;
        str_ = new char[size_ + 1];
        for (size_t i = 0; i < size_; i++)
            str_[i] = a.str_[i];
        str_[size_] = '\0';
        ab_ = a.ab_;
    }
    return *this;
}
 
void A::show_(){
    std::cout << "Кол-во символов: " << size_ << std::endl;
    std::cout << str_ << std::endl;
    std::cout << "Вещественное число: " << ab_ << std::endl;
}
 
A operator+(A a1, A a2){
    A a3;
    a3.size_ = a1.size_ + a2.size_;
    if (a3.str_)
        delete[] a3.str_;
    a3.str_ = new char[a3.size_ + 1];
    for (size_t i = 0; i < a1.size_; i++)
        a3.str_[i] = a1.str_[i];
    for (size_t i = 0; i < a2.size_; i++)
        a3.str_[a1.size_ + i] = a2.str_[i];
    a3.str_[a3.size_] = '\0';
    a3.ab_ = a1.ab_ + a2.ab_;
    return a3;
}


main.cpp
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include"A.h"
 
int main(){
    setlocale(0, "");
    A a1(11, "Привет мир!", 1.01);
    A a2(10, " Как дела?", 2.8);
    a1.show_();
    a2.show_();
    A a3(5," sd", 3.7);
    a3 = a1 + a2;
    a3.show_();
 
    system("pause");
    return 0;
}


Добавлено через 33 минуты
Хм.. Поправил конструктор копирования и все заработало.
C++
1
2
3
4
5
6
7
8
A::A(const A& a){
        size_ = a.size_;
        str_ = new char[size_ + 1];
        for (size_t i = 0; i < size_; i++)
            str_[i] = a.str_[i];
        str_[size_] = '\0';
        ab_ = a.ab_;
}
Вот только такое чувство что там может образоваться утечка памяти, или я зря волнуюсь и все там нормально?
Проконсультируйте пожалуйста по этому коду меня, всёли зделано правильно и что можно поправить, с меня громадная благодарность и + к карме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2016, 17:44
Ответы с готовыми решениями:

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного...

Найти ошибки в коде и исправить эти ошибки
Есть у меня вот такой код: #include &lt;iostream&gt; using namespace std; ...

Найти причины возникновения ошибок в коде и исправить эти ошибки
#include &lt;vcl.h&gt; #include &lt;iostream.h&gt; #include &lt;vector&gt; #include...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Всем привет, я новичок. Решил попробовать создать простенький класс который...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Уважаемые пользователи просьба помочь с одной проблемой,смысл в том что при...

4
hoggy
Нарушитель
Эксперт С++
7081 / 3125 / 647
Регистрация: 15.11.2014
Сообщений: 7,172
Завершенные тесты: 1
21.09.2016, 17:50 2
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
A operator=(const A&);
C++
1
const A& operator=(const A&);
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
A operator+(A, A);
C++
1
A operator+(const A&, const A&A);
Добавлено через 27 секунд
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
void show_();
C++
1
void show_()const;
Добавлено через 1 минуту
Цитата Сообщение от Chronid Посмотреть сообщение
A(){};
баг:
C++
1
2
3
4
5
6
#include<iostream>
#include"A.h"
 
int main(){
    A a1;
}
1
Chronid
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
21.09.2016, 18:06  [ТС] 3
Цитата Сообщение от hoggy Посмотреть сообщение
баг:
C++
1
2
3
4
#include<iostream>
#include"A.h"
int main(){
 A a1;
}
Извените, а в чем тут баг?
У меня все работает без ошибок..
0
hoggy
Нарушитель
Эксперт С++
7081 / 3125 / 647
Регистрация: 15.11.2014
Сообщений: 7,172
Завершенные тесты: 1
21.09.2016, 18:24 4
Цитата Сообщение от Chronid Посмотреть сообщение
Извените, а в чем тут баг?
вот здесь:
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
A(){};
дефолтный конструктор не выставляет значения своим данным-членам.
вот здесь:
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
char* str_;
будет мусор
далее когда завершиться время жизни объекта сработает:
Цитата Сообщение от Chronid Посмотреть сообщение
C++
1
2
3
4
A::~A(){ 
if (str_)
delete[] str_; 
}
из-за мусора условие выполнится.
и начнется попытка грохнуть память по случайному адресу.
что завершится аварией.
Цитата Сообщение от Chronid Посмотреть сообщение
У меня все работает без ошибок..
вероятно у вас линукс какой нибудь.
на них система при старте процесса зануляет всю память.
но в процессе работы память заполниться различным мусором.
и однажды этот мусор убъет процесс.
1
Chronid
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
21.09.2016, 18:58  [ТС] 5
Спс, убрал конструктор по умочнанию и подправил конструктор с параметрами
на зануление в случае отсутствия входящих аргументов:
C++
1
A(size_t size = 0, char* str = 0, double ab = 0)
0
21.09.2016, 18:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2016, 18:58

Найти причины возникновения ошибок в коде и исправить эти ошибки
не пойму что он от меня хочет #include &lt;math.h&gt; #include &lt;stdio.h&gt;...

Найти причины возникновения ошибок в коде и исправить эти ошибки
void cvedenmagaz(string cveden, tovar* tov, basa univermag, basa product){ ...

Найти причины возникновения ошибок в коде и исправить эти ошибки
Уважаемые форумчане, тут вот изучал дружественные методы, классы и функции и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru