如果我在析构函数定义中注释行arr = 0;
,则程序会因错误而终止。如果我取消注释该行,即 arr
设置为 0
,则程序执行时不会出现任何错误。为什么会这样,因为不需要将指针设置为NULL。指针本身在析构函数执行后被销毁。
下面是我的代码。
数组.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/