C++ 析构函数问题
这两种代码的区别是什么?第一种情况下是否存在内存泄漏 未定义析构函数C++ 析构函数问题,c++,visual-c++,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
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;
}
};
或者定义了析构函数
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;
}
};
应该是
delete[] books;
~Library() {
delete[] books;
}
在第二种情况下:书籍是作为数组分配的,因此必须作为数组删除。第一个版本没有内存泄漏
区别在于,在第一种情况下,书籍的内存包含在库的每个实例的分配中,而在第二种情况下,使用堆单独分配
应该是
delete[] books;
~Library() {
delete[] books;
}
在第二种情况下:书籍是作为数组分配的,因此必须作为数组删除。第一个版本没有内存泄漏
不同之处在于,在第一种情况下,图书内存包含在库的每个实例的分配中,而在第二种情况下,它是使用堆单独分配的。首先,第二个代码应该是
delete[] books;
~Library() {
delete[] books;
}
new必须与delete匹配,new[]必须与delete[]匹配
在第一个代码中,Library的每个实例都包含50个Book实例。复制库将复制这50个实例。没有内存泄漏
在第二段代码中,Library的实例只包含一个指向书籍的指针。在没有默认复制构造函数的情况下复制实例只复制指针-原始和副本将共享50本书,第二个被销毁的人将对已删除的内存发出delete,这是一个错误。首先,第二个代码应该是
delete[] books;
~Library() {
delete[] books;
}
~Library()
{
delete[] books;
}
new必须与delete匹配,new[]必须与delete[]匹配
在第一个代码中,Library的每个实例都包含50个Book实例。复制库将复制这50个实例。没有内存泄漏
在第二段代码中,Library的实例只包含一个指向书籍的指针。在没有默认复制构造函数的情况下复制实例只复制指针-原始和副本将共享50本书,第二个被销毁的人将对已删除的内存发出delete,这是一个错误
~Library()
{
delete[] books;
}
这是一个适当的解决办法。您的代码中可能存在以下问题,您可以考虑:
1使用初始化列表
在第二种情况下:
你真的需要做什么?局部对象还不够吗?我猜你的书没有超过书堆的大小。在开始时查看您正在创建的代码,并在结束时删除。记住,堆叠更快,更安全
也要熟悉valgrind,它是一个非常棒的工具。检查cppcheck是否对您有帮助。sudoapt在ubuntu中安装cppcheck
这是一个适当的解决办法。您的代码中可能存在以下问题,您可以考虑:
1使用初始化列表
在第二种情况下:
你真的需要做什么?局部对象还不够吗?我猜你的书没有超过书堆的大小。在开始时查看您正在创建的代码,并在结束时删除。记住,堆叠更快,更安全
也要熟悉valgrind,它是一个非常棒的工具。检查cppcheck是否对您有帮助。sudo apt在ubuntu中安装cppcheck。第二个有UB。第一个没有内存泄漏。第二个还引入了三/五规则。我是oop的初学者,不知道UB是什么意思,也不知道三/五规则是什么。我更喜欢使用std::vector books;。此外,更喜欢在构造函数中使用成员初始值设定项,而不是赋值。例如库:索引0{}而不是库{index=0;}。看起来您还没有读过C++的书。第二篇有UB。第一个没有内存泄漏。第二个还引入了三/五规则。我是oop的初学者,不知道UB是什么意思,也不知道三/五规则是什么。我更喜欢使用std::vector books;。此外,更喜欢在构造函数中使用成员初始值设定项,而不是赋值。例如,库:索引0{}而不是库{index=0;}。看起来您还没有读过C++的书。