vector :: clear:内存问题

时间:2011-03-29 11:31:36

标签: c++ stl mfc vector

Vector :: Clear()将擦除向量数组中的元素。

问题是如果我们在向量列表中传递对象,那么Clear()将删除对象的内存。

我发布了我的样本:

     CData *m_data = new CData();
     vector<CData*> m_logdata;
     m_logdata.push_back(m_data);
     m_logdata.clear();

这段代码会删除m_data分配的内存,还是只删除矢量列表中的元素?

此致 卡西克

2 个答案:

答案 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;
}