在我的一个对象中,我创建了一个无符号字符数组成员来存储一些图像数据:
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;
崩溃,留下此错误消息:
此时我不知道为什么会这样。
我尝试过的一些事情是:
imageData = 0
,遗憾的是我的程序仍在delete [] imageData
行崩溃。memset(&imageData, 0, imageSize);
,但这给了我一个访问冲突错误。每次程序仍然在同一行崩溃。我知道有人在看我的代码,认为“你好,你要做的就是____________________。”有人可以告诉我我做错了吗?
编辑:抱歉,我说错了。我每次在循环的开头创建此对象,并在循环结束时删除,我不知道为什么我在开头和结尾说该计划。
答案 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);
}