删除数组 > 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
我有一个非常奇怪的问题。以下是复制它的最小代码。
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