我想在类中使用指针数组(非常大):
char* myClass::_myArray[1200000]; // 1.2 million elements
如果我在构造函数中新建它:
myClass::myClass()
{
for (int n = 0; n < 1200000; n++)
{
_myArray[n] = new char[32];
}
}
然后在我的析构函数中,我处理它:
myClass::~myClass()
{
for (int n = 0; n < 1200000; n++)
{
if (NULL != _myArray[n])
{
delete[] _myArray[n]; // exception throws here
_myArray[n] = NULL;
}
}
}
它总是抛出异常如下图所示:
我不知道为什么。我想知道我是否想为类对象预先分配一个缓冲区,直到它退出,我该怎么做?此缓冲区应该像全局变量一样工作,可以在调用类中的函数/方法时使用。
非常感谢。感谢任何意见和教育。
其他信息:
我设置数组大小1000(char* myClass::_myArray[1000];
),它工作正常。当我将其设置为5000时,它会在应用程序退出后抛出异常。当它为120万时,应用程序启动时会抛出异常。
delete[] _myArray[n]
是发生异常的地方,但它发生在随机n
号码上。
答案 0 :(得分:4)
if (NULL != _myArray[n])
{
delete[] _myArray[n];
_myArray = NULL;
}
您不希望在循环中将_myArray
设置为NULL 。实际上,从不想要将_myArray
设置为NULL。如果_myArray
实际定义为您在此处显示(而不是char** myClass::_myArray = new char*[1200000];
),则将其设置为NULL应该是编译器错误。
答案 1 :(得分:2)
您在单个指针上调用delete[]
而不只是delete
:
for (int n = 0; n < 1200000; n++)
{
if (NULL != _myArray[n])
{
delete _myArray[n];
_myArray[n] = NULL;
}
}
或者你可以在数组本身上调用delete[]
:
delete[] _myArray;
这应该是安全的,因为你在析构函数中使用它并且_myArray超出了你的对象的范围,因此一旦这个类的实例消失,没有任何带有现在无效对象的指针可用。如果那不是
请参阅http://www.cplusplus.com/reference/new/operator%20delete[]/以获取参考资料