Почему возникает такая ошибка и как “правильно” написать деструктор?

208
18 мая 2017, 12:19

Проблема возникает именно в том момент когда вызывается десктруктор, если доверит создание деструктора "автоматике", то ни чего не меняется и все равно выпадает такая ошибка. Собственно у меня возникает два вопроса:

  1. Принципы написания деструктора класса (можно ссылочку, только на русском желательно)
  2. Что здесь и как надо исправить/дописать что бы все работала правильно и ни каких ошибок не возникало ?

Test.cpp

A.h

A.cpp

Заранее спасибо за помощь.

Answer 1

У вас классическая ошибка: нет копирующего конструктора, он генерируется компилятором, и просто копирует почленно - в том числе a.

В итоге:

A test3 = test1 + test2;

Создается временный объект с выделением памяти. Далее этот временный объект передается конструктору test3, и указатель на выделенную временному объекту память просто копируется. Затем временный объект уничтожается, память освобождается. Затем, когда уничтожается test3, эта же память освобождается второй раз.

Учтите, в программировании действует презумпция корректности компилятора. Пояснение "а, проблема в компиляторе" выдает новичка с головой. Опытный программист будет до последнего искать ошибку у себя...

Правильное решение -

A(const A& nw):n(10),a(new int[n]) {
    for(int i = 0; i < n; ++i) a[i] = nw.a[i];
}

Полуправильное :) -

A test3;
test3 = test1 + test 2;

И еще - не стесняйтесь ставить const - например, аргумент оператора присваивания вы же не меняете - делайте его константным. Функция вывода объект не меняет? делайте ее константной...

P.S. И еще - не нужно задавать вопрос с картинкой, из которой достаточно одной строки, зато лучше давайте код прямо в вопросе... Будь настроение не таким благодушным - не полез бы открывать еще три окна, чтоб на ваш код посмотреть... Зацепило только ваше "компилятор виноват" - ну не верю, чтоб он был виноват в такой ерунде :) - нарваться на ошибку компилятора в таком месте - все равно что подорваться на какой-нибудь мине времен Наполеона на Красной площади :)

READ ALSO
Реализовать Counting Sort в стиле C++

Реализовать Counting Sort в стиле C++

Стало интересно, как оформить алгоритм сортировки подсчетом из Кормена по стандартам C++ для сортировки произвольных объектов, а не только...

318
Не могу считать строку в массив структур

Не могу считать строку в массив структур

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

788
Передача файла через каналы/pipe

Передача файла через каналы/pipe

Пишу клиент/серверное приложение, клиент вводит имя файла, сервер ищет етот файл у себя и передает его клиентуНе могу найти никакого способа...

279
MSVC 2013 не находит подключенные .h файлы

MSVC 2013 не находит подключенные .h файлы

Доброго дняОпыта работы с студией не так много и каждый новый проект сталкиваюсь с новыми приключениями

224