c++ - 析构函数中缺少 ptr = NULL 导致错误,在将 ptr 设置为 NULL 时工作正常。为什么?

标签 c++ destructor dynamic-memory-allocation

如果我在析构函数定义中注释行arr = 0;,则程序会因错误而终止。如果我取消注释该行,即 arr 设置为 0,则程序执行时不会出现任何错误。为什么会这样,因为不需要将指针设置为NULL。指针本身在析构函数执行后被销毁。

Screenshot of the error

下面是我的代码。

数组.h

#ifndef ARRAY_H
#define ARRAY_H
class Array
{
    int* arr;
    int size;
public:
    Array(int size = 10);
    Array(const Array& arr);
    ~Array();
    void display () const;
};
#endif

数组.cpp

#include "Array.h"
#include <iostream>
using namespace std;

Array::Array(int size)
{
    arr = new int[size];
    this->size = size;
    for (int i = 0; i < size; i++)
        arr[i] = i;
}

Array::Array(const Array& a)
{
    arr = new int[a.size];
    for (int i = 0; i < a.size; i++)
        arr[i] = a.arr[i];
    size = a.size;
}

Array::~Array()
{
    delete[] arr;
    arr = 0;
}

void Array::display() const
{
    cout << endl;
    for (int i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}

main.cpp

#include <iostream>
#include "Array.h"
using namespace std;

int main()
{
    Array arr(4);
    Array a1 = arr;
    a1.display();
    arr.~Array();
    a1.display();

    return 0;
}

最佳答案

您不应该在这里调用析构函数:

arr.~Array();

arr超出范围时,析构函数将被第二次调用。当对指针数据成员arr调用delete[]时,这会导致未定义的行为。当您将其设置为 0 时,您就回避了问题,但事实仍然是您不应该像那样调用析构函数。

下面的示例显示了自动存储对象的生命周期如何与其范围绑定(bind):

#include <iostream>

struct Foo
{
  ~Foo() { std::cout << "Foo destructor\n";
};

int main()
{
  std::cout << in main()\n";

  {
    Foo f;
  }  // f gets destroyed here

  std::cout << "Exiting main()\n";
};

关于c++ - 析构函数中缺少 ptr = NULL 导致错误,在将 ptr 设置为 NULL 时工作正常。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20163110/

相关文章:

c++ - 多线程池分配器

c++ - 为什么我需要手动删除 vector 中的指针?

C#/命令行界面 : Destructor not called if Dispose() used in it

c++ - C++向 vector 添加对象会破坏早期的对象

c - 在 C 中初始化内存分配器

c - Visual Studio 动态分配多维数组

c++ - Valgrind——可能丢失警告

c++ - 检查函数指针类型的调用约定

c++ - 具有部分模板特化的 g++ 错误

c++ - free():下一个大小无效(正常)&munmap_chunk():C中的无效指针