【问题标题】:Some questions in STL map and list using in c++在 C++ 中使用 STL 映射和列表中的一些问题
【发布时间】:2011-05-13 08:33:39
【问题描述】:

您好,我想咨询一下: 我有地图和清单

问题:

以下是析构函数的实现吗:

   for (map<string,SymbolTableNode*>::iterator i = symbolTable.begin();
                         i != symbolTable.end(); ++i)
   {
       delete i;
   }
   symbolTable.clear();

还是我错过了一些记忆?

关于列表:

   list<MyClass2*> mylist;
   mylist.push_front(new MyClass());
   mylist.pop_front();

pop 调用删除吗?或者在这种情况下我有内存泄漏?如果有漏水问题,我该怎么做才能避免呢?

谢谢。

【问题讨论】:

  • 我认为你应该删除迭代器 i 的值,而不是它本身。
  • 非常感谢 Andreas 和所有其他人,这对我帮助很大

标签: c++ stl memory-leaks


【解决方案1】:

没有pop_front 不会调用删除。在弹出它之前,您必须自己删除指针。:

list<MyClass2*> mylist;
mylist.push_front(new MyClass());
delete mylist.front();
mylist.pop_front();

而析构函数应该是:

delete i->second;

【讨论】:

    【解决方案2】:

    你有泄漏。查看智能指针 (http://en.wikipedia.org/wiki/Smart_pointer)

    更明确地说:

    list<boost::shared_ptr<MyClass2> > mylist;
    
    
    mylist.pop(); // now it will invoke delete
    

    【讨论】:

      【解决方案3】:

      你真的需要一个指针列表吗?你不能有一个简单的列表吗?

      list<MyClass> mylist;
      mylist.push_front(MyClass());
      

      它将为您省去内存管理的痛苦。

      如果您需要指针,请使用 boost 中的智能指针或指针容器:http://www.boost.org/doc/libs/1_46_1/libs/ptr_container/doc/ptr_container.html

      【讨论】:

      • 是的,我需要指针,因为我想更改列表中的元素
      • 这无关紧要,您可以更改列表中的对象。你可以做 my_list.back().value = 42;
      • 试过它可以工作,这意味着 my_list.back() 返回对 value 的引用,我认为如果它按值保存元素,那么它会以相同的方式返回它。
      【解决方案4】:
      delete i;
      

      错了。

      应该是这样的:

      delete i->second; 
      

      因为i 指向一对。

      【讨论】:

      • 另外,因为i 不是一个指针,而是一个迭代器(所以delete i 甚至不应该编译)。
      【解决方案5】:

      纳瓦兹 - 你错了。

      地图的迭代器元素是一对,因此正确的删除调用是:

      delete (*i).second;
      

      附: 好的 - 现在我看到你已经解决了这个问题:)

      【讨论】:

      • 当 i 是地图上的迭代器时 (i*).second 和 i->second 有什么区别?
      • -1 表示 delete i-&gt;second 不像 delete (*i).second 那样做并且不知道它们完全相同!
      • 为 STL 对生成相同的代码,但值得一提的是 -> 运算符可以在 C++ 中重载(尽管 . 不能),因此其他类可能会有所不同。
      • 纳瓦兹!我写道,你的第一个答案是错误的。看看我后来添加的“P.S”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多