VS 2010 C++在删除结构数组时崩溃

VS 2010 C++ Crash when deleting an array of structures

本文关键字:数组 崩溃 结构 删除 2010 C++ VS      更新时间:2023-10-16

我有一个类,它的成员函数mBoundingBox由以下结构组成

typedef struct
{
    unsigned int xMin;
    unsigned int yMin;
    unsigned int xMax;
    unsigned int yMax;
} boundingBox;
class CImgProc
{
public:
    CImgProc(void);
    virtual ~CImgProc(void);
...
    boundingBox *mBoundingBox;
...
}

在代码中,我分配成员:

mBoundingBox = new boundingBox [mBlobCnt];

随意使用它(不要给它分配任何指针,只使用数组索引),然后,当我退出时,I:

if (mBoundingBox != NULL) delete [] mBoundingBox;

这导致了一个错误。

有什么意见吗?

更新信息。该错误确实发生在析构函数的终止处。VS生成的消息是:

Windows在ProcImage.exe中触发了断点。

这可能是由于堆损坏。。。

这也可能是由于用户在ProcImage.exe具有焦点时按下F12。

输出窗口可能具有更多诊断信息。

我在构造函数中将指针设置为NULL,然后在需要时分配(使用new)。指针是有效的,但显然不在堆上(break位于dbgheap.c中)。

一旦我分配了内存,我就不会用它做任何指针魔术。在这种情况下,我会循环浏览图像并收集统计数据。然后我使用存储在这个内存中的统计数据回到我的图像中,但同样,以一种相当暴力的方式,所以没有其他东西利用这个内存。

对我来说,使用new来创建结构数组是合法的,不是吗?

Doh!!!很抱歉浪费你们的时间。我重新挖掘,发现我的创造和毁灭都很好,但在中间的某个地方,我设置了mBoundingBox[X]的值。无论它在哪里,X都是创建的数组的昏暗。典型的用户错误,只是错误出现的一个令人惊讶的地方。

很可能您已经删除了两次数组。为了更好地管理它,请使用

delete[] mBoundingBox;
mBoundingBox = 0;

而不是

if (mBoundingBox != NULL) delete [] mBoundingBox;

或者更好地使用智能指针。

首先,以下检查是错误的

if (mBoundingBox != NULL) delete [] mBoundingBox;

new在分配内存失败时不会返回NULL,而是抛出异常。

如果你想像现在这样继续,请使用另一个版本的"new"。在另一个版本中,new将返回NULL,而不是引发异常。

mBoundingBox = new (std::nothrow) boundingBox [mBlobCnt];