析构函数问题

时间:2012-11-07 20:49:35

标签: c++ visual-c++

这两个代码有什么区别?在第一种情况下是否存在内存泄漏?

没有定义析构函数

 class Library
{
private:
    Book books[50];
    int index;
public:
    Library()
    {

        index=0;
    }
};

或使用析构函数定义

class Library
{
private:
    Book *books;
    int index;
public:
    Library()
    {
        books=new Book[50];
        index=0;
    }
    ~Library()
    {
        delete books;
    }
};

3 个答案:

答案 0 :(得分:3)

delete books;

应该是

delete[] books;

在第二个中:books被分配为数组,因此必须作为数组删除。第一个版本没有内存泄漏。

不同之处在于,在第一种情况下,books的内存包含在Library的每个实例的分配中,在第二种情况下,它是使用堆分别分配的。 / p>

答案 1 :(得分:1)

首先,第二个代码应为

~Library() {
  delete[] books;
}

new必须与delete匹配,new[]必须与delete[]匹配。

在第一个代码中,Library的每个实例都包含50个Book个实例。复制Library将复制这50个实例。没有内存泄漏。

在第二个代码中,Library的实例只包含指向书籍的指针。复制实例(没有默认的复制构造函数)只复制指针 - 原始和副本将共享50本书,而第二个被销毁的人将在已删除的内存上发出delete,这是一个错误。

答案 2 :(得分:1)

~Library()
{
    delete[] books;
}

是一个合适的解决方案。代码中存在可用的免费问题,您可以考虑这些问题:

1)使用初始化列表

在第二种情况下:

2)你真的需要做指针吗?不是一个本地对象吗?(我猜你的书不超过堆栈大小)。查看您在开头创建的代码,最后删除的代码。记住堆栈更快,更安全。

熟悉valgrind,它是一个非常棒的工具。检查cppcheck是否会对您有所帮助。 ubuntu中的“sudo apt-get install cppcheck”。