如果我arr = 0;
在析构函数定义中注释该行,则该程序将终止并显示错误。如果我取消注释该行,即arr
设置为0
,则程序执行无任何错误。为什么这样做,因为不需要将指针设置为NULL。指针本身在执行析构函数后被销毁。
下面是我的代码。
数组
#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
Array.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
超出范围时,析构函数将被第二次调用。当delete[]
在指针数据成员上调用时,将导致未定义的行为arr
。当您将其设置0
为时,您可以绕开问题,但事实是您不应该这样调用析构函数。
这是一个示例,显示自动存储对象的生存期如何与其范围绑定:
#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";
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句