【问题标题】:Memory management of vector矢量的内存管理
【发布时间】:2011-10-02 01:25:01
【问题描述】:

我有一个带有私有“指向向量”成员 pV 的 C++ 类,我在构造函数中为其分配了一个新向量...

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

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

delete pV;

我收到一个段错误和一条消息,表明我正在尝试释放一开始没有分配的 pv。我检查了 pV->size() 是 4K 的东西,所以我确定它是由 new 分配的内存。

【问题讨论】:

  • 尝试在 valgrind 的 memcheck 下运行您的程序 - 它会告诉您在第二次释放时内存第一次释放或分配的位置。
  • 为什么不将向量作为普通成员?否则请参阅克里斯蒂安的回答。

标签: c++ vector segmentation-fault


【解决方案1】:

具有所有权语义的指针成员(在构造函数中分配和在析构函数中解除分配)通常需要编写自定义复制构造函数和赋值运算符(通常称为the Rule of Three),因为编译器生成的只会复制指针成员而不是它的底层对象。所以如果你在某个时候复制你的包含对象,你最终会得到两个对象与成员具有相同的指针,而一个被销毁的对象第二次尝试删除一个已经删除的指针。

最简单的情况下,您应该确保您的复制构造函数执行类似的操作

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

你的赋值运算符会做类似的事情

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

【讨论】:

    猜你喜欢
    • 2019-11-24
    • 2012-06-08
    • 2014-08-19
    • 2020-08-19
    • 1970-01-01
    • 2017-03-27
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多