Vector :: Clear()将擦除向量数组中的元素。
问题是如果我们在向量列表中传递对象,那么Clear()将删除对象的内存。
我发布了我的样本:
CData *m_data = new CData();
vector<CData*> m_logdata;
m_logdata.push_back(m_data);
m_logdata.clear();
这段代码会删除m_data分配的内存,还是只删除矢量列表中的元素?
此致 卡西克
答案 0 :(得分:7)
没有矢量,但有一个矢量。
vector.clear()将破坏向量中的对象。如果这些对象是指针,则不会删除指向的对象。
struct Foo {
};
vector<Foo> vec1;
vector<Foo *> vec2;
vec1.push_back(Foo());
vec2.push_back(new Foo());
vec1.clear(); // Will destruct the Foo instances
vec2.clear(); // Will not delete the pointed to Foo instances
在您编辑的帖子中:
m_logdata.clear();
这将不删除您的CData
实例。它只会破坏指针,这是一个无操作。
编辑:回应评论。
for (size_t p = 0; p < m_logdata.size(); ++p)
delete m_logdata[p];
m_logdata.clear();
答案 1 :(得分:0)
这个问题很模糊......但无论哪种方式,我想您是想知道在调用vector
时是否会自动删除存储在clear()
中的指针。
事实并非如此。无论您在vector
中存储什么,都会在clear()
发生时调用其析构函数。而原始类型(如指针)的析构函数确实没有。
从我的SGI实施:
/**
* Erases all the elements. Note that this function only erases the
* elements, and that if the elements themselves are pointers, the
* pointed-to memory is not touched in any way. Managing the pointer is
* the user's responsibilty.
*/
void
clear() { erase(begin(), end()); }
要正确删除任何STL容器中的项目指针,最简单的方法是创建一个仿函数并将其应用于每个项目:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <functional>
#include <algorithm>
template <typename ValueT>
struct func_delete : public std::unary_function<ValueT,void>
{
void operator()( ValueT& item ) { delete item; }
};
struct Foo
{
~Foo() { std::cout << "Foo::~Foo()" << std::endl; }
};
template <typename ContainerT>
void delete_container( ContainerT& container )
{
std::for_each( container.begin(), container.end(), func_delete<typename ContainerT::value_type>() );
}
int main( int argc, char** argv )
{
std::vector<Foo*> foos;
foos.push_back( new Foo );
foos.push_back( new Foo );
foos.push_back( new Foo );
// Either of these two lines will work
//std::for_each( foos.begin(), foos.end(), func_delete<Foo*>() );
//delete_container( foos );
foos.clear();
return EXIT_SUCCESS;
}