我有以下课程Tuple
:
class Tuple {
public:
Tuple(){
}
Tuple(vector<string> newValueList){
this->values = newValueList;
}
~Tuple() {
}
private:
vector<string> values;
}
当我调用析构函数方法时,我得到了内存泄漏(使用valgrind):
Invalid read of size 8
at 0x40BE66: std::vector<std::string, std::allocator<std::string> >::~vector()
by 0x40BB2D: Tuple::~Tuple()
我不确定为什么会发生这种情况。我认为向量做了自己的内存管理。
编辑:
以下是我如何创建Tuple
:
Tuple* Tuple::duplicate(string value, int count, bool pull){
Tuple* returnTuple = 0;
vector<string> newValueList;
for (size_t i = 0; i < this->values.size(); i++) {
if (((int)i == count)&&!pull)
continue;
else{
newValueList.push_back(this->values[i]);
}
}
returnTuple = new Tuple(newValueList);
return returnTuple;
}
答案 0 :(得分:0)
好的,所以我在你的评论之后想出了解决方案。
我有一个vector<Tuple*>
,它导致内存泄漏就像疯了一样。我浏览了整个代码并将Tuple*
的每个实例更改为Tuple
并进行了其他必要的更改,以确保我的代码仍然有用。在这之后,我对Tuple
的析构函数没有任何问题。感谢您的所有意见。
答案 1 :(得分:0)
Tuple* Tuple::duplicate(string value, int count, bool pull)
什么是价值使用?
您正在动态分配对象
returnTuple = new Tuple(newValueList);
Vector正在Tuple对象中初始化。如果在代码中的某处明确删除returnTuple,则不会发生内存泄漏。您必须跟踪动态创建的所有对象。或者更好的建议是使用shared_pointers,它将管理内存释放。
同时将Tuple *更改为Tuple是有帮助的,因为您已从动态/堆分配转移到堆栈分配。堆栈对象超出范围后,将自动调用析构函数。