2011-05-13 47 views
0

你好,我想请教一下: 我有地图和列表在STL地图和列表中的某些问题,使用C++

问题:

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

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(); 

并弹出调用删除?或者在这种情况下我有内存泄漏?如果有泄漏问题,那我该怎么做才能避免它?

谢谢。

+0

我想你应该删除迭代器我,不是本身的价值。 – atoMerz 2011-05-13 08:37:40

+0

非常感谢Andreas和其他人对我的帮助很大 – 2011-05-13 08:45:08

回答

1

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

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

它会为您节省内存管理的痛苦。

如果你需要的指针,然后使用智能指针或指针集装箱从提升:http://www.boost.org/doc/libs/1_46_1/libs/ptr_container/doc/ptr_container.html

+0

是的,我需要指针,因为我想更改列表中的元素 – 2011-05-13 10:21:12

+0

这没什么可做的,您可以更改列表中的对象。你可以做my_list.back()。value = 42; – 2011-05-13 10:54:33

+0

试过它它的工作意味着my_list.back()返回值的引用,我认为如果它通过值保存元素,那么它以相同的方式返回它。 – 2011-05-15 07:53:11

3

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

更明确地定义:

list<boost::shared_ptr<MyClass2> > mylist; 


mylist.pop(); // now it will invoke delete 
4

没有pop_front不会调用删除。你必须自行删除指针你的流行。:

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

前和析构函数大概应该是:

delete i->second; 
0
delete i; 

错误。

这应该是这样的:

delete i->second; 

i因为点到一对。

+1

另外,因为'i'不是一个指针,而是一个迭代器(所以'删除i'甚至不应该编译)。 – 2011-05-13 09:01:16

+0

@詹姆斯:谢谢你补充一点。 – Nawaz 2011-05-13 09:04:12

-1

Nawaz - 你错了。用于在地图

迭代器元件在一对如此适当删除调用是:

delete (*i).second; 

P.S. 好的 - 现在我看到你已经修复了这个:)

+0

当我是地图上的迭代器时,(i *)。second和i-> second之间有什么区别? – 2011-05-13 08:48:06

+0

-1表示'delete i-> second'不会做'删除(* i)'。第二“,并且不知道它们完全相同! – Nawaz 2011-05-13 08:50:15

+0

为STL对生成的代码相同,但值得一提的是 - >运算符可以在C++中重载(尽管不能),所以其他类可能会有所不同。 – HostileFork 2011-05-14 07:08:11