我有一个非常离奇的问题。以下是重现它的最小代码。
int main(void)
{
class MyClass {
public:
int* ptr;
MyClass(int i)
{
std::cout << "Constructor" << std::endl;
ptr = new int [i];
};
~MyClass()
{
std::cout << "Destructor" << std::endl;
delete[] ptr;
};
};
MyClass MyClassInstance(130047);
delete &MyClassInstance;
return 0;
};
我假设您不会猜测如果我用130046替换130047,应用程序始终不会崩溃,而130047则始终崩溃,给出0xc0000005访问冲突的代码。
输出结果为:
Constructor
Destructor
Destructor
所以析构函数被调用两次(正如人们所期望的那样)。那是问题吗?但那么为什么 i&lt; = 130046 确定并且 i&gt; 130046 不行??
显然,这是一个非常简单的例子,所以我根本不需要调用delete
运算符 - 但实际上我正在编写一个更大的项目,我宁愿决定何时调用析构函数。或者我应该将其留给编译器自行决定?
为了记录,我正在运行Windows 7,GNU GCC编译器,我的IDE是Code :: Blocks,这是一个简单的控制台应用程序......我应该包括哪些其他信息?
提前致谢!
vpprof
答案 0 :(得分:0)
如果您动态分配对象,则可以使用您的方法,否则一旦您的对象离开其范围就会自动调用析构函数,并且由于您已经删除了它,它会尝试删除无效指针。
因此,删除删除或动态分配对象将解决问题:
MyClass *MyClassInstance = new MyClass(130047);
delete MyClassInstance;
或
MyClass MyClassInstance(130047);
} // leave scope