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

标签 c++ memory vector

我正在尝试将一组新的 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 中的两个 ModelImages 具有相同的距离、强度、derivX、derivY 数组分配内存地址。

感谢任何帮助,谢谢。

最佳答案

这可能是因为您没有复制构造函数。

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

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

关于删除时出现 C++ 内存错误 - 调试断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9283951/

相关文章:

c++ - 为什么我要读文件中的最后一个字两次?

linux - 如果遇到内存泄漏,在linux上会把内存占用计算到进程中吗?

c++ - Linux 分配器不会释放小块内存

python - 使用 lambdify 将涉及向量转置的表达式转换为数值函数

c++ - 如何使用带有多个定界符的 istringstream

c++ - 有没有办法让 Rcpp 停止定义 NDEBUG?

c++ - 我可以检查 C++ 迭代器是否为 null 吗?

c++ - 为什么输出 vector 的大小会导致分配?

c++ - 为什么这个内部类不能编译?

python - Python内存匹配游戏中出现"List index out of range"错误