删除包含字符串向量的对象时内存泄漏

时间:2013-11-21 02:39:19

标签: c++ memory-management valgrind

我有以下课程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;
}

2 个答案:

答案 0 :(得分:0)

好的,所以我在你的评论之后想出了解决方案。

我有一个vector<Tuple*>,它导致内存泄漏就像疯了一样。我浏览了整个代码并将Tuple*的每个实例更改为Tuple并进行了其他必要的更改,以确保我的代码仍然有用。在这之后,我对Tuple的析构函数没有任何问题。感谢您的所有意见。

答案 1 :(得分:0)

Tuple* Tuple::duplicate(string value, int count, bool pull)
  1. 什么是价值使用?

  2. 您正在动态分配对象

    returnTuple = new Tuple(newValueList);

    Vector正在Tuple对象中初始化。如果在代码中的某处明确删除returnTuple,则不会发生内存泄漏。您必须跟踪动态创建的所有对象。或者更好的建议是使用shared_pointers,它将管理内存释放。

  3. 同时将Tuple *更改为Tuple是有帮助的,因为您已从动态/堆分配转移到堆栈分配。堆栈对象超出范围后,将自动调用析构函数。