C++ деструктор. Неожиданный break.
У меня такая проблемка: есть код.
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 <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. Первый объект удачяется нормально. Собственно, это и был вопрос: с чем это связано? Заранее благодарен.
вы про
delete int_CpyNode;
? - так это же вроде как разные объекты должны получиться.... Нет?
вы про
delete int_CpyNode;
? - так это же вроде как разные объекты должны получиться.... Нет?
этой строкой:
ListNode<int>* int_CpyNode = int_Node;
не создается новый объект, а присваивается указатель на уже созданный
Нет. Это разные переменные, но указывают они на один и тот же объект. Читаем про указатели.
if (int_CpyNode) delete int_CpyNode;
if (int_CpyNode) delete int_CpyNode;
С каких пор delete записывает NULL во все указатели указывающие на удаляемый объект?
[QUOTE=St0p]тут же ещё один вопрос: конструктор копирования (который реализован здесь) в каком случае срабатывает?
Если ты хочешь добится создания копии списка, то у тебя ничего не выйдет, т.к. констуктор не делает копии списка у тебя.
насколько я понял, тут просто проверяется наличие объекта, что это не пустой указатель. А деструктор в ListNode<T> удаляет только значение этого элемента списка.
Я здесь не список копирую, а отдельно звено. До списка я ещё пока не дошел толком :)
Пример который он привел не верен в контексте ошибки первого сообщения темы.
Я здесь не список копирую, а отдельно звено. До списка я ещё пока не дошел толком :)
Звено ты копируешь как-то странно. Так же как и удаляешь, оставляя указатели на освобожденную память.
Извиняюсь... и правда фигню сказал
А какая возможная альтернатива?