为什么我的析构函数只会在其父析构函数调用之后崩溃我的代码?

时间:2015-10-10 04:01:22

标签: c++ linux visual-studio-2013 c-strings

我有一个由winery元素组成的双线程链接列表,winery是一个具有自己数据字段的类。我遇到的问题是winery的析构函数:

winery::~winery()
{
        delete[] name;
        delete[] location;
}

我收到了一个"双免费或腐败(外出):0x0000000000402940" Linux中出错,我在Windows Visual Studio中收到此错误:

enter image description here

所以我在winery的析构函数上放了一个断点,发现每次引用我的酒厂对象时都会调用它。奇怪的是,错误抛出的唯一时间是winery的析构函数被调用,因为我的list的析构函数被调用,即使酒庄已经被称为两个或者三次。我想知道为什么我的代码在第二次winery的析构函数在其父析构函数未被调用时被调用时没有崩溃。



作为旁注/问题:我能够通过删除winery的析构函数并将其调用放入其中的父析构函数来解决此内存泄漏问题:

list::~list()
{
    for (node* next; headByName; headByName = next)
    {
        next = headByName->nextByName;
        delete[] headByName->item.getName();
        delete[] headByName->item.getLocation();
        delete headByName;
    }
}

winery是一个名称为'item'的类型,getName()getLocation()是酒庄的功能,可返回这些字符串。这是有效的,但它反直觉,并且肯定似乎效率低下。是不好的代码?我应该使用`winery&#s;析构函数并在某种程度上调用它时重写?

2 个答案:

答案 0 :(得分:1)

您的代码似乎多次在某些指针上调用delete

delete[] headByName->item.getName();
delete[] headByName->item.getLocation();

delete[] name;
delete[] location;

我建议删除前两行。

此外,正如评论中所建议的那样,由于未在winery中实现复制构造函数和复制赋值运算符,您可能会遇到问题。请查看What is The Rule of Three?以更深入地了解该问题。

答案 1 :(得分:0)

您的链接列表实施存在缺陷。您正在存储.centercarosal { text-align: -moz-center; } 而不是指向它的指针。这意味着如果没有适当的深层复制构造函数,数据就不会重复,只会指向指针值。这将导致破坏。

修改链接列表以存储指针(更好的方法)或提供复制数据的复制构造函数。后者将导致更多的内存分配并且速度变慢,并且不允许您实际更改值,以便存储特定酒厂的每个位置具有相同的值。

当不使用指针时会发生什么:

winery