矢量的内存管理

Posted

技术标签:

【中文标题】矢量的内存管理【英文标题】: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 下运行您的程序 - 它会告诉您在第二次释放时内存第一次释放或分配的位置。 为什么不将向量作为普通成员?否则请参阅克里斯蒂安的回答。 【参考方案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;

【讨论】:

以上是关于矢量的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

更新的矢量元素不打印

Flink内存管理

Spark原理 内存管理

ION 内存管理

:内存管理 -- 内存管理的概念

Spark内存管理详解(下)——内存管理