【发布时间】:2012-03-06 05:42:38
【问题描述】:
我正在尝试将一组新模型图像添加到向量中,但出现错误,调试断言失败,表达式:_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;
}
构造函数和析构函数,以及复制和交换函数如下:
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 表明向量中的两个 ModelImage 为距离、强度、derivX、derivY 数组分配了相同的内存地址。
感谢您的帮助。
【问题讨论】:
-
我确实有一个复制构造函数,并且刚刚在此处包含了它。
-
我在您的更新中没有看到复制构造函数。它的签名类似于
ModelImage(ModelImage const& other); -
感谢您明确指出 - 我没有意识到我没有实现复制和交换习语的复制部分,并且认为我已经实现了。我第一次与他们合作。
-
你为什么不做
ModelImages.push_back(ModelImage(MOD_WIDTH,MOD_HEIGHT));?如果您要按值将图像存储在向量中,则循环内的动态分配是不必要的,而且很奇怪。