在类中使用指针数组

时间:2014-09-11 20:36:41

标签: c++ pointers memory memory-management

我想在类中使用指针数组(非常大):

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;
      }
   }
}

它总是抛出异常如下图所示:

enter image description here

我不知道为什么。我想知道我是否想为类对象预先分配一个缓冲区,直到它退出,我该怎么做?此缓冲区应该像全局变量一样工作,可以在调用类中的函数/方法时使用。

非常感谢。感谢任何意见和教育。

其他信息:

我设置数组大小1000(char* myClass::_myArray[1000];),它工作正常。当我将其设置为5000时,它会在应用程序退出后抛出异常。当它为120万时,应用程序启动时会抛出异常。

delete[] _myArray[n]是发生异常的地方,但它发生在随机n号码上。

2 个答案:

答案 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[]/以获取参考资料