我试图将一组新的ModelImages添加到 vector 中,并且出现错误,调试断言失败,表达式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)。尝试删除生成的第二个ModelImage时,会发生这种情况。

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;
}

构造函数和析构函数,以及 copy-and-swap 函数,如下所示:
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之前,查看 vector ModelImages显示, vector 中的两个ModelImage为距离,强度,derivX,derivY数组分配了相同的内存地址。

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

最佳答案

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

提示:复制构造函数类似于:

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

不要与operator==分配混淆

为什么无论如何都要动态创建这些ModelImage(如果立即将它们扔掉)?
而且,为什么不采用vector<float>(nPixels)而不是new float[nPixels]

07-26 09:10