我试图将一组新的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]
?