向量的内存管理

Memory management of vector

本文关键字:管理 内存 向量      更新时间:2023-10-16

我有一个c++类,有一个私有的"指向向量的指针"成员pV,我在构造函数中给它分配了一个新的向量…

pV = new vector<FMCounter>(n, FMCounter(arg1))>;

但是当我在类的析构函数中删除

delete pV;

我得到一个段错误和一个消息,我试图释放pv,没有分配在第一个地方。我检查了pV->size()是4K的东西,所以我确信它是由new分配的内存。

具有所有权语义的指针成员(在构造函数中分配,在析构函数中释放)通常需要编写自定义的复制构造函数和赋值操作符(通常称为三法则),因为编译器生成的这些操作符只复制指针成员,而不复制其底层对象。因此,如果在某个时候复制包含对象,最终会得到两个具有相同指针的对象,第二个被销毁的对象试图删除已经删除的指针。

最简单地说,你应该确保你的复制构造函数做类似

的事情
TheClass::TheClass(const TheClass &rhs)
    : pV(new vector<FMCounter>(*rhs.pV))
{
}

你的赋值操作符像

TheClass& TheClass::operator=(const TheClass &rhs)
{
    *pV = *rhs.pV
    return *this;
}