Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вектор и деструктор 
V
    Опции темы
B3cK
Дата 30.5.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.5.2005
Где: Минск

Репутация: 1
Всего: 1



Код

class A{
char *p1;
char *p2;
....
//bla bla bla
public:
A(char* a, char* b)
{
p1=new char[strlen(a)+1];
strcpy (p1,a); 
p2=new char[strlen(b)+1];
strcpy (p2,b);
}
~A(){delete[]p1;
         delete[]p2;
        }
....
//bla bla bla
};       

При добавлении нового объекта данного класса в вектор вылетает ошибка "Debug Assertion Failed!".
Компилятор VC6++ ошибок не выводит. Если деструктор закоментировать, то все отлично работает.
Как можно объяснить такое поведение деструктора при добавлении объекта в вектор?

 
PM MAIL ICQ   Вверх
maxim1000
Дата 30.5.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



при копировании такого объекта создаётся новый объект с такими же указателями (ну и при присваивании - соответственно)
когда один из них удаляется, указатели становятся некорректными
когда удаляется второй объект, получается ошибка... 


--------------------
qqq
PM WWW   Вверх
B3cK
Дата 30.5.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.5.2005
Где: Минск

Репутация: 1
Всего: 1



Подожди, какое копирование, присваивание.
Я через функцию push_back() помещаю в конец вектора
новый полностью инициализированный объект.
 
PM MAIL ICQ   Вверх
maxim1000
Дата 30.5.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(B3cK @  30.5.2006,  15:39 Найти цитируемый пост)
Я через функцию push_back() помещаю в конец вектора
новый полностью инициализированный объект

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


--------------------
qqq
PM WWW   Вверх
MAKCim
Дата 30.5.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Подожди, какое копирование, присваивание.
Я через функцию push_back() помещаю в конец вектора
новый полностью инициализированный объект.

создается копия объекта, а т к у тебя не определен копирующий конструктор и ты работаешь с чистыми указателями, возможны проблемы
напиши
Код

class A
{
...
public:
    A(const A& obj)
        : p1(new char [strlen(obj.p1)+1]), p2(new char [strlen(obj.p2)+1])
    {
        strcpy(p1,obj.p1);
        strcpy(p2,obj.p2)
    }
};
 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
B3cK
Дата 30.5.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 29.5.2005
Где: Минск

Репутация: 1
Всего: 1



Спасиб, теперь конфликт понятен.
Вопрос закрыт. 
PM MAIL ICQ   Вверх
Earnest
Дата 30.5.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Оператор присваивания тоже нужен. Самый простой способ проверить - декларировать в private-секции оператор присваивания и выслушать от компилятора массу приятных слов.

Вообще лучше всегда явно определять, копируемый класс ты пишешь или нет. Т.е. если в классе используются некопируемые сущности (указатели или какие-нибудь неразделяемые дескритпоры ресурсов), нужно либо явно определять операторы копирования, либо относить их в private-секцию. 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.