1

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

没有定义析构函数

 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;
    }
};
4

3 回答 3

3
delete books;

应该

delete[] books;

第二种:books作为数组分配,所以必须作为数组删除。第一个版本没有内存泄漏。

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

于 2012-11-07T20:53:59.433 回答
1

首先,第二个代码应该是

~Library() {
  delete[] books;
}

new必须匹配deletenew[]必须匹配delete[]

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

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

于 2012-11-07T20:56:18.260 回答
1
~Library()
{
    delete[] books;
}

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

1) 使用初始化列表

在第二种情况下:

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

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

于 2012-11-07T21:01:24.710 回答