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

C++ Access violation when deleting array > 130046 elements?

我有一个非常奇怪的问题。以下是复制它的最小代码。

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<=130046 OK 而 i>130046 不OK?!?

显然,这是一个非常简单的示例,所以我根本不需要调用 delete 运算符 — 但实际上我正在编写一个更大的项目,我宁愿决定何时调用析构函数.还是我应该让编译器自行决定?

郑重声明,我是 运行 Windows 7、GNU GCC 编译器,我的 IDE 是 Code::Blocks,这是一个简单的控制台应用程序……我还应该包括哪些其他信息?

提前致谢!

vpprof

如果你动态分配你的对象,你可以使用你的方法,否则一旦你的对象离开它的范围,析构函数将被自动调用,因为你已经删除了它,它会尝试删除一个无效的指针。

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

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

MyClass MyClassInstance(130047);
} // leave scope