这两个代码有什么区别?在第一种情况下是否存在内存泄漏?
没有定义析构函数
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;
}
};
答案 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”。