std :: vector.clear()是否删除(可用内存)每个元素?

考虑这个代码:

#include <vector> void Example() { std::vector<TCHAR*> list; TCHAR* pLine = new TCHAR[20]; list.push_back(pLine); list.clear(); // is delete called here? // is delete pLine; necessary? } 

list.clear()调用每个元素上的删除吗? 即我必须释放内存之前/之后list.clear()?

没有(你需要在最后做你自己的删除操作,因为在你的示例中,秃头指针的销毁不会做任何事情)。 但是你可以使用一个boost [或其他基于RAII的成语]智能指针来使它做正确的事情( auto_ptr在容器中不能正常工作,因为它在复制等情况下具有不兼容的行为),但是要确保你了解陷阱这些智能指针在使用之前。 (正如Benoit所说,在这种情况下, basic_string就是你真正想要的东西。)

话虽如此,有必要了解智能指针的陷阱,让他们隐式地照顾内存pipe理,所以你不必明确做这件事情是远不容易出错。

编辑:实质上修改,以包含Benoit带入他更彻底的答案,谢谢从Earwicker和詹姆斯·马塔强烈的刺激 – 感谢推动我做这个尽职调查!

当调用clear()时,std :: vector会调用它包含的每个元素的析构函数。 在你的具体情况下,它会破坏指针,但对象仍然存在。

智能指针是正确的路要走,但要小心。 auto_ptr不能在std容器中使用。 boost :: scoped_ptr也不能。 boost :: shared_ptr可以,但它不会在你的情况下工作,因为你没有指向一个对象的指针,你实际上是使用一个数组。 所以你的问题的解决scheme是使用boost :: shared_array 。

但是我build议你使用std :: basic_string,而不是在内存pipe理的地方处理,同时还可以获得使用string的好处。

你可以写一个简单的模板函数为你做这个:

 template <class T> void deleteInVector(vector<T*>* deleteme) { while(!deleteme->empty()) { delete deleteme->back(); deleteme->pop_back(); } delete deleteme; } 

也许这里有些事情是不好的做法,但我不这么认为。 虽然评论总是很好,但对我来说还是可以的。

这里有一个方法,你可以告诉它没有 – 尝试一个没有完全定义的类:

 #include <vector> class NotDefined; void clearVector( std::vector<NotDefined*>& clearme ) { clearme.clear(); // is delete called here? } 

如果这个代码片段编译,那么它不能调用析构函数,因为析构函数没有定义。

不。 它不这样做,因为不能保证你没有在其他地方使用指针。 如果它不是一个指针variables,它将释放它们(通过调用析构函数)

您可能也可以使用Boost指针容器库 。 这里没有特别推荐(同样是因为你使用的是数组而不是单个对象,尽pipestd::string会照顾到这一点),但是它是一个有用而鲜为人知的库,可以解决标题中所述的问题。