矢量的内存管理
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;
【讨论】:
以上是关于矢量的内存管理的主要内容,如果未能解决你的问题,请参考以下文章