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

Исправить оишбку в коде - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Задача Четыре чертёнка http://www.cyberforum.ru/cpp-beginners/thread804489.html
Мир в опасности. Один известный мошенник по имени Остап умер, и, попав в ад, решил заключить сделку с дьяволом. Игра простая: четыре чертёнка делятся на две команды — «чёрные» и «чумазые» — и выходят...
C++ проблемы с сортировкой пузырьком собственно сабж проблема заключается в том, что программа сортирует ЧАСТЬ массива. Допустим, надо отсортировать каждый столбец по уменьшению значения суммы цифр каждого элемента. Так программа... http://www.cyberforum.ru/cpp-beginners/thread804461.html
C++ Иерархическое дерево. Начало пути
Здравствуйте!!! Я перерыл много учебников и форумов и везде пишут о бинарных деревьях. В них я более менее разобрался, а вот как создать дерево, в котором может быть более 2 сыновей. У меня задание:...
вызвать неперегруженный оператор при наличии перегруженного C++
привет всем. возникла такая проблема: есть два объекта одного класса и перегруженный оператор=. одним из полей этих объектов является указатель на указатель(квадратная матрица порядка n). в теле...
C++ Найти дружественные числа (создавал в MingwStudio) http://www.cyberforum.ru/cpp-beginners/thread804437.html
Подскажите что не так #include <iostream.h> int sumdel(a) { int i,s; s=0; for(i=1;i<=a/2;i++) {if(a%i==0) s=s+i; } return s; }
C++ Методы вызываются через указатель на объект класса; Как компилятор определяет, какой из методов надо вызвать? Ребята, если вникать, то вообще ничё непонятно. Вот смотрите: пусть у нас есть абстрактный класс abstr (abstr.h) и в нём определено, например 10 функций виртуальных функции. Эти функции реализованы в... подробнее

Показать сообщение отдельно
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2013, 14:02
Деструктор здесь не при чём. Вы передаёте в функцию объект по значению, из-за этого проблемы. Память под копией name_ освобождается. Потом опять вызов функции, опять создаётся копия name_, по адресу в name_ уже муссор (что и выводится), при выходе из функции попытка освободить уже освобождённую память. Или передавайте объект по ссылке, или сделайте эту функцию методом класса.

Добавлено через 1 час 25 минут
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
зачем тут конструктор копирования?
Потому что конструктор копирования по умолчанию делает поверхностное копирование, т.е. просто копирует поля класса. Если там указатель, то копируется сам указатель, а не то, на что он указывает. В таких случаях определяют конструктор для глубокого копирования. Тогда у временных объектов будут свои указатели и своя память под ними, и не будет двойного освобождения памяти, как в этом случае.
Добавляете вот такой конструктор копирования и ошибка исчезнет:
C++
1
2
3
4
5
6
7
Unit(const Unit &obj)
{
    hitpoints_ = obj.hitpoints_;
    damage_ = obj.damage_;
    name_ = new char[strlen(obj.name_) + 1];
    strcpy(name_, obj.name_);
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru