删除数组时的C ++访问冲突> 130046元素?

时间:2017-05-04 00:23:39

标签: c++ access-violation delete-operator

我有一个非常离奇的问题。以下是重现它的最小代码。

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

1 个答案:

答案 0 :(得分:0)

如果您动态分配对象,则可以使用您的方法,否则一旦您的对象离开其范围就会自动调用析构函数,并且由于您已经删除了它,它会尝试删除无效指针。

因此,删除删除或动态分配对象将解决问题:

MyClass *MyClassInstance = new MyClass(130047);
delete MyClassInstance;

MyClass MyClassInstance(130047);
} // leave scope