无法删除unsigned char *数组

时间:2013-02-11 14:20:18

标签: c++ object memory heap

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

    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;

崩溃,留下此错误消息:

error

此时我不知道为什么会这样。

我尝试过的一些事情是:

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

每次程序仍然在同一行崩溃。我知道有人在看我的代码,认为“你好,你要做的就是____________________。”有人可以告诉我我做错了吗?

编辑:抱歉,我说错了。我每次在循环的开头创建此对象,并在循环结束时删除,我不知道为什么我在开头和结尾说该计划。

5 个答案:

答案 0 :(得分:5)

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

void MyObject::DeleteAllMembers
{
    delete [] imageData;
    imageData = 0; // <-- here
}

答案 1 :(得分:3)

咦?

如果您只在构造对象时分配(使用new[]),那么您不能在循环中多次delete[]。只能delete[]一次,将同一指针再次传递给delete[]将会失败。

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

答案 2 :(得分:1)

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

memset(&imageData, 0, imageSize);

然后,在不再需要时将其删除。

答案 3 :(得分:0)

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

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

  • 如果在“循环”的每次迭代中销毁'imageData',则必须再次创建它,然后再次使用(并销毁)。

  • “循环”在哪里?如果它在一个属于'MyObject'成员的函数内,则会改变你处理'imageData'的方式

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

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

答案 4 :(得分:0)

我怀疑你有  违反了Rule of Three

此问题的最佳解决方案是完全避免它,例如使用std::vector。请参阅“Rule of Zero”。

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

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

void MyObject::DeleteAllMembers
{
  imageData.resize(0);
}