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++的书。