vector :: clear: Проблема с памятью - PullRequest
0 голосов
/ 29 марта 2011

Vector :: Clear () сотрет элементы в массиве векторов.

Проблема в том, что если мы передадим объекты в векторный список, то Clear () удалит память объектов или нет.

Я публикую свой образец:

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

удалит ли этот код память, выделенную m_data, или просто удалит элемент из списка векторов?

С уважением, karthik

Ответы [ 2 ]

7 голосов
/ 29 марта 2011

Нет вектора, есть вектор.

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();
0 голосов
/ 29 марта 2011

Вопрос довольно расплывчатый ... но в любом случае, я думаю, вам интересно, будут ли указатели, хранящиеся в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...