2

在我的一个对象中,我创建了一个无符号字符数组成员来存储一些图像数据:

    unsigned char* imageData;

在构造函数中我用 new 初始化它:

    MyObject::MyObject()
    {
        int imageSize = 6054400;
        imageData = new unsigned char[imageSize];
    }

imageData 在整个循环过程中被填充。

这个对象(MyObject)直到循环结束才会被删除,但我需要在循环中途删除 imageData。所以我刚刚创建了这个函数:

    void MyObject::DeleteAllMembers
    {
        delete [] imageData;
    }

我在循环结束时调用它:

    theObj.DeleteAllMembers();

问题是每次我的程序到达代码行时:

    delete [] imageData;

它崩溃了,留下这个错误信息:

错误

在这一点上,我不知道为什么会这样。

我尝试过的一些事情是:

  • 用 imageSize+1 而不是仅仅用 imageSize 初始化 imageData
  • 将删除命令移动到析构函数并手动删除每个通过循环运行的对象
  • 使用 delete imageData 而不是 delete [] imageData,即使我相当确定我需要使用 delete []
  • imageData = 0删除后我试过做,不幸的是我的程序仍然崩溃delete [] imageData
  • 我试过使用memset(&imageData, 0, imageSize);,但这给了我一个访问冲突错误。

每次,程序仍然在同一行崩溃。我知道有人在查看我的代码时在想“你这个白痴,你所要做的就是____________________”。有人可以告诉我我做错了什么吗?

编辑:对不起,我说的不正确。我每次在循环开始时创建这个对象并在循环结束时被删除,我不知道为什么我在程序的开始和结束时说。

4

5 回答 5

5

您可能需要稍微添加以防止多次删除同一指针:

void MyObject::DeleteAllMembers
{
    delete [] imageData;
    imageData = 0; // <-- here
}
于 2013-02-11T14:25:14.107 回答
3

嗯?

如果仅new[]在构造对象时分配 (with ),则不能delete[]在循环中多次分配。你只能delete[]做一次,再次传递相同的指针delete[]会失败。

此外,它没有任何意义:如果您只在对象构造时创建一次数组,那么为什么需要多次销毁它呢?

于 2013-02-11T14:22:46.010 回答
1

如果您需要重新使用它,请重置您的缓冲区而不是在循环中删除它。以 memset 为例。

memset(&imageData, 0, imageSize);

然后,当您不再需要它时将其删除。

于 2013-02-11T14:33:47.053 回答
0

你的问题有点不清楚,但有几点:

  • 如果 'imageData' 是 'MyObject' 的成员,那么为什么要从 OUTSIDE 'MyObject' 如此明确地管理它的破坏呢?

  • 如果“imageData”在“循环”的每次迭代中都被销毁,那么它必须在再次使用(和销毁)之前再次创建。

  • “循环”在哪里?如果它在作为“MyObject”成员的函数中,或者没有改变您管理“imageData”的方式

  • 如果大小发生变化,您只需要在“循环”的每次迭代中删除并重新分配数组。

  • 如果“imageData”最终在“循环”范围内被创建和销毁,为什么它会成为类成员?

于 2013-02-11T14:37:44.013 回答
0

我怀疑你违反了三法则

这个问题的最佳解决方案是完全避免它,例如使用std::vector. 参见“零规则”。

class MyObject 
{
  std::vector<unsigned char> imageData;
  ...
};

MyObject::MyObject() : imageData(6054400) {}

void MyObject::DeleteAllMembers
{
  imageData.resize(0);
}
于 2013-02-11T14:49:40.500 回答