Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Chronid
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
#1

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

21.09.2016, 17:44. Просмотров 281. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти ошибки в коде и исправить эти ошибки - C++ (C++):

Найти ошибки в коде и исправить эти ошибки (Наследование) - C++
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...

Найти ошибки в коде и исправить эти ошибки - C++
Есть у меня вот такой код: #include &lt;iostream&gt; using namespace std; class A{ private: int* a; size_t size_; ...

Найти причины возникновения ошибок в коде и исправить эти ошибки - C++
помогите пожалуйста исправить ошибку вот код в с++ // ConsoleApplication9.cpp: определяет точку входа для консольного приложения. ...

Найти причины возникновения ошибок в коде и исправить эти ошибки - C++
Доброго дня уважаемые форумчане! Просьба помочь в таком вопросе,написал простейший код...но он на отрез отказывается работать...не могу...

Найти причины возникновения ошибок в коде и исправить эти ошибки - C++
Имеется две формулы (поиск следующего приближения для метода SOR): ...

Найти причины возникновения ошибок в коде и исправить эти ошибки - C++
Совсем я запуталась. Опять куча ошибок. Помогите разобраться, пжлст. П.5.18.Правил Запрещено размещать задания и решения в виде...

4
hoggy
6798 / 2984 / 514
Регистрация: 15.11.2014
Сообщений: 6,754
Завершенные тесты: 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
6798 / 2984 / 514
Регистрация: 15.11.2014
Сообщений: 6,754
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

Найти причины возникновения ошибок в коде и исправить эти ошибки - C++
Делаю лабу по программированию, всё бы хорошо но проблема с одной строчкой #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; ...

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

Найти причины возникновения ошибок в коде и исправить эти ошибки - C++
Не пойму на что ругается и как исправить.

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


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

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

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