删除C++内存错误 - 调试断言失败

问题描述:

我想添加一组新的ModelImages到一个向量,并得到一个错误,调试断言失败,表达式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)。尝试删除生成的第二个ModelImage时会发生这种情况。删除C++内存错误 - 调试断言失败

std::vector<ModelImage> ModelImages; 

for(int n=0;n<nParamSets;n++) 
{ 
    ModelImage* mI = new ModelImage(MOD_WIDTH,MOD_HEIGHT); 
    ModelImages.push_back(*mI); 
    delete mI; 
} 

构造函数和析构函数,复制和交换funcitons,如下:

ModelImage(int _width, int _height) 
{ 
    width = _width; 
    height = _height; 
    nPixels = width*height; 
    distance = new float[nPixels]; 
    intensity = new float[nPixels]; 
    derivX = new float[nPixels]; 
    derivY = new float[nPixels]; 
    maxDistance = 0.0f; 
    minDistance = 0.0f; 
} 

~ModelImage() 
{ 
    delete [] derivX; 
    delete [] derivY; 
    delete [] distance; 
    delete [] intensity; 
} 

ModelImage& operator=(ModelImage other) 
{ 
    swap(*this, other); 
    return *this; 
} 

friend void swap(ModelImage& first, ModelImage& second) 
{ 
    using std::swap; 
    swap(first.derivX,second.derivX); 
    swap(first.derivY,second.derivY); 
    swap(first.distance,second.distance); 
    swap(first.intensity,second.intensity); 

    swap(first.nPixels,second.nPixels); 
    swap(first.width,second.width); 
    swap(first.height,second.height); 
} 

就在试图删除第二ModelImage,看着矢量ModelImages表明,这两种ModelImages在向量具有相同的分配内存地址的距离,强度,派生,派生数组。

任何帮助表示赞赏,谢谢。

+0

我确实有一个拷贝构造函数,并且刚刚在这里包含了它。 – 3Pi 2012-02-14 20:54:36

+0

我在更新中看不到复制构造函数。它的签名看起来像'ModelImage(ModelImage const&other);' – 2012-02-14 20:59:19

+0

谢谢你明确指出 - 我没有意识到我没有实现复制和交换习惯用法的复制部分,并认为我有。我第一次和他们一起工作。 – 3Pi 2012-02-14 21:03:17

我的第一个猜测是你没有定义拷贝构造函数。向量'push_back将默认复制构造您的ModelImage,它将简单地复制成员指针,但不会重新分配它们指向的内存。 但是,删除原始对象后,这些引用将会消失。

提示:复制构造是一样的东西:

ModelImage(const ModelImage& orig) { 
    // appropriately reinitialize from orig 
} 

不要与分配operator==

迷惑你为什么要创建这些ModelImage小号动态的(如果你把他们的权利之外)? 为什么不采取vector<float>(nPixels)而不是new float[nPixels]

+0

动态创建它们,因为我试过ModelImage mI(MOD_WIDTH,MOD_HEIGHT); ModelImages.push_back(* MI);而且这也没有奏效。 – 3Pi 2012-02-14 20:58:48

+0

你试过了吗?ModelImages.push_back(ModelImage(MOD_WIDTH,MOD_HEIGHT));'?但是这并不能解决复制构造函数的问题。 – moooeeeep 2012-02-14 21:04:23

这可能是由于您没有复制构造函数。

创建一个拷贝构造函数,用于复制指针所引用的内存。

当使用std容器时,他们通常会在插入时创建对象的副本。由于您没有拷贝构造函数,因此您的所有成员指针最终都指向相同的内存地址,因为它只是执行成员数据副本。一旦临时副本被破坏,(或者在插入后调用原始对象上的删除)时,插入对象的内存已将其内存从其下删除。

这不是从你发布你是否有以下成员的适当的拷贝构造函数和赋值操作符明确:

distance 
intensity 
derivX 
derivY 

如果没有,你需要这些。 (有关更多信息,请参阅Rule of three (C++ programming))。

更好的选择是对这些数据成员使用std::vector<double>。这样复制,分配和销毁都将自动处理。你仍然想要构建它们以拥有适当数量的元素。

我假设您已将所有数组定义为类中的指针。默认拷贝拷贝指针的值,这意味着当你删除外部函数中的指针时,删除下划线的内存。

只是一对夫妇的建议

-Utilize载体,而不是浮动*的std ::载体具有复制和移动定义构造函数ALLREAD

-The循环不需要使用免费的店在所有价值语义和应对得到完全支持,并且不易出错。

for(int n=0;n<nParamSets;n++) 
{  
    ModelImages.push_back(ModelImage(MOD_WIDTH,MOD_HEIGHT)); 
}