对象Second
何时超出范围?如果我保留第三个 cout 语句,则会出现编译器错误。即使我包围了 Second 和 cout 语句的初始化。
#include <iostream>
using namespace std;
class MyArray{
public:
int Size;
int* data;
MyArray(int s) : Size(s), data(new int[s]){}
~MyArray(){
delete[](this->data);
}
};
int main()
{
MyArray First(20);
First.data[0] = 25;
MyArray Second = First;
cout << First.data[0] << endl;
cout << Second.data[0] << endl;
cout << Second.data[0] << endl;
system("PAUSE");
return 0;
}
运行时错误:
最佳答案
事情是这样的:MyArray
对象在初始化时获得一个指向它们自己的名为 data
的整数数组的指针。然而,这一行改变了 Second
对象的内容:
MyArray Second = First;
现在,First.data
和 Second.data
都指向同一个 int[]
数组,因为默认的复制构造函数和赋值运算符执行浅复制。
这很糟糕,因为编译器可以自由地在代码中最后一次使用First
后销毁它。因此,访问 Second.data[0]
可能已经无效。
此外,一旦 First
和 Second
在 main()
末尾超出范围,它们都会 将尝试删除数据
。只有第一个才会成功;第二个将触发未定义的行为。
为避免将来出现此类错误,请使用 rule of three 。它表示,如果您定义析构函数、复制构造函数或赋值运算符,则可能需要这三个函数。
您的代码只有析构函数。添加复制构造函数和赋值运算符将解决此问题,并防止分配 MyArray
对象时发生内存泄漏。
关于C++ 对象超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20298728/