Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++ деструктор. Неожиданный break.

12K
13 мая 2008 года
St0p
59 / / 15.04.2007
день добрый.
У меня такая проблемка: есть код.
Код:
#include <iostream>

template <class T>
class ListNode
{
public:
    ListNode();
    ListNode(ListNode<T>& lNode);
    ListNode(T pElem);
    ~ListNode();
    template <class U> friend std::ostream& operator<<(std::ostream& ostr, ListNode<T>* oNode);

private:
    ListNode<T>* m_pNext;
    T* m_pElem;
}; // ListNode class



template <class T>
ListNode<T>::ListNode()
{
} // ListNode()


template <class T>
ListNode<T>::ListNode(ListNode<T>& lNode)
{
    m_pNext = lNode.m_pNext;
    m_pElem = new T;
    *m_pElem = *lNode.m_pElem;
} // ListNode(ListNode<T>* lNode)


template <class T>
ListNode<T>::ListNode(T pElem)
{
    m_pElem = new T;
    *m_pElem = pElem;
} // ListNode(T pElem)


template <class T>
ListNode<T>::~ListNode()
{
    if(m_pElem)
    {
        delete m_pElem;
    }
} // ~ListNode()


template <class U>
std::ostream& operator<<(std::ostream &ostr, ListNode<U>* oNode)
{
    ostr<<"Element is "<<*oNode->m_pElem<<";\n";
    return ostr;
} // template <class U> std::ostream& operator<<(std::ostream& ostr, ListNode<T>* oNode)


и что-то а-ля юнит тест к нему:

Код:
#include "ListNode.h"
#include <iostream>


int main()
{
    ListNode<int>* int_Node = new ListNode<int>(17);
    std::cout<<int_Node;
    ListNode<int>* int_CpyNode = int_Node;
    std::cout<<int_CpyNode;

    delete int_Node;
    delete int_CpyNode;
    getchar();
    return 0;
}


и при выполнении получаю break на деструкторе, во время удаления int_CpyNode. Первый объект удачяется нормально. Собственно, это и был вопрос: с чем это связано? Заранее благодарен.
353
13 мая 2008 года
Nixus
840 / / 04.01.2007
Это связано с тем, что ты удаляешь объект, который строчкой выше уже удалил.
12K
13 мая 2008 года
St0p
59 / / 15.04.2007
Ээ.... Не понял...
вы про
 
Код:
delete int_Node;
    delete int_CpyNode;

? - так это же вроде как разные объекты должны получиться.... Нет?
11
13 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: St0p
Ээ.... Не понял...
вы про
 
Код:
delete int_Node;
    delete int_CpyNode;

? - так это же вроде как разные объекты должны получиться.... Нет?



этой строкой:
ListNode<int>* int_CpyNode = int_Node;
не создается новый объект, а присваивается указатель на уже созданный

353
13 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: St0p
так это же вроде как разные объекты должны получиться.... Нет?


Нет. Это разные переменные, но указывают они на один и тот же объект. Читаем про указатели.

12K
13 мая 2008 года
St0p
59 / / 15.04.2007
Аа!!! Я идеот... Спасибо... Называется, ненужно долбиться лбом в бетонную стену, только сейчас додумался посмотреть на присвоение. Извиняюсь, спасибо ещё раз.
11
13 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
проверяй на валидность перед удалением
 
Код:
if (int_Node) delete int_Node;
if (int_CpyNode) delete int_CpyNode;
12K
13 мая 2008 года
St0p
59 / / 15.04.2007
тут же ещё один вопрос: конструктор копирования (который реализован здесь) в каком случае срабатывает?
 
Код:
ListNode<int>* int_CpyNode = new ListNode<int>(*int_Node);
?
353
13 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: oxotnik333
проверяй на валидность перед удалением
 
Код:
if (int_Node) delete int_Node;
if (int_CpyNode) delete int_CpyNode;


С каких пор delete записывает NULL во все указатели указывающие на удаляемый объект?

[QUOTE=St0p]тут же ещё один вопрос: конструктор копирования (который реализован здесь) в каком случае срабатывает?

 
Код:
ListNode<int>* int_CpyNode = new ListNode<int>(*int_Node);
[/QUOTE]
Если ты хочешь добится создания копии списка, то у тебя ничего не выйдет, т.к. констуктор не делает копии списка у тебя.
12K
13 мая 2008 года
St0p
59 / / 15.04.2007
Цитата:
С каких пор delete записывает NULL во все указатели указывающие на удаляемый объект?



насколько я понял, тут просто проверяется наличие объекта, что это не пустой указатель. А деструктор в ListNode<T> удаляет только значение этого элемента списка.

Цитата:
Если ты хочешь добится создания копии списка, то у тебя ничего не выйдет, т.к. констуктор не делает копии списка у тебя.



Я здесь не список копирую, а отдельно звено. До списка я ещё пока не дошел толком :)

353
13 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: St0p
насколько я понял, тут просто проверяется наличие объекта, что это не пустой указатель. А деструктор в ListNode<T> удаляет только значение этого элемента списка.


Пример который он привел не верен в контексте ошибки первого сообщения темы.

Цитата: St0p

Я здесь не список копирую, а отдельно звено. До списка я ещё пока не дошел толком :)


Звено ты копируешь как-то странно. Так же как и удаляешь, оставляя указатели на освобожденную память.

11
13 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Nixus
С каких пор delete записывает NULL во все указатели указывающие на удаляемый объект?



Извиняюсь... и правда фигню сказал

12K
13 мая 2008 года
St0p
59 / / 15.04.2007
Цитата:
Звено ты копируешь как-то странно. Так же как и удаляешь, оставляя указатели на освобожденную память.



А какая возможная альтернатива?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог