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

C++ 删除包含字符串向量的对象时内存泄漏,c++,memory-management,valgrind,C++,Memory Management,Valgrind,我有以下类,Tuple: class Tuple { public: Tuple(){ } Tuple(vector<string> newValueList){ this->values = newValueList; } ~Tuple() { } private: vector<string> values; } 好的,在你的评论之后,我想出了解决办法 我有一个

我有以下类,
Tuple

class Tuple {
    public:

    Tuple(){

    }

    Tuple(vector<string> newValueList){
        this->values = newValueList;
    }

    ~Tuple() {

    }
    private:

    vector<string> values;
}

好的,在你的评论之后,我想出了解决办法

我有一个
向量
,它疯狂地导致了内存泄漏。我检查了整个代码,将
Tuple*
的每个实例都更改为
Tuple
,并进行了其他必要的更改,以确保代码仍然有效。这样做之后,我对
Tuple
的析构函数没有任何问题。谢谢你的意见

Tuple* Tuple::duplicate(string value, int count, bool pull)
  • 价值的用途是什么

  • 您正在动态分配对象

    returnTuple=新元组(newValueList)

    向量正在元组对象内初始化。如果显式删除代码中某个地方的returnTuple,则不会出现内存泄漏。您必须跟踪动态创建的所有对象。或者更好的建议是使用共享的_指针,这将管理内存释放


  • 将Tuple*更改为Tuple也有帮助,因为您将从动态/堆分配转换为堆栈分配。一旦堆栈对象超出范围,就会自动调用析构函数。

    如何创建
    元组
    对象?仅此代码本身没有问题。尽管当您已经在成员函数中时,不需要显式设置
    的值^^^^可以是
    值=新值列表
    。虽然这显然不是问题所在。您使用
    new
    分配
    Tuple
    ,并且可能不会
    删除它。为什么要首先堆分配它?“当我调用析构函数时……”你不调用析构函数(新的位置)。要么删除动态分配并由它为您触发,要么自动实例在离开作用域时触发。这就引出了Yuushi的评论。您在哪里删除要返回的
    tuple
    ?Valgrind将有一个内存来自何处的分配堆栈跟踪,一直返回到
    main()
    ,所以您为什么不看一下/post。
    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;
    }
    
    Tuple* Tuple::duplicate(string value, int count, bool pull)