stl + вопрос управления памятью - PullRequest
0 голосов
/ 08 июня 2011

Например, у меня следующий код:

#include <set>
using namespace std;

struct SomeStruct 
{
    int a;
};

int main ()
{
    set<SomeStruct *> *some_cont = new set<SomeStruct *>;
    set<SomeStruct *>::iterator it;
    SomeStruct *tmp;

    for (int i = 0 ; i < 1000; i ++)
    {
        tmp = new SomeStruct;
        tmp->a = i;
        some_cont->insert(tmp);
    }

    for (it = some_cont->begin(); it != some_cont->end(); it ++)
    {
        delete (*it);
    }

    some_cont->clear(); // <<<<THIS LINE
    delete some_cont;
    return 0;
}

Нужно ли вызывать «ЭТУ ЛИНИЮ» перед удалением some_cont во избежание утечек памяти, или деструктор будет вызываться автоматически?

Ответы [ 5 ]

5 голосов
/ 08 июня 2011

Вам не нужно звонить, деструктор будет вызван наверняка.

3 голосов
/ 08 июня 2011

Нет, нет необходимости очищать устройство перед его уничтожением.

Обратите внимание, что очень редко требуется выделять std::set (или любой стандартный контейнер) вручную. Вам было бы гораздо лучше просто поместить его в автоматическое хранилище и позволить C ++ выполнить очистку за вас:

Так что вместо

set<SomeStruct *> *some_cont = new set<SomeStruct *>;

использование

set<SomeStruct *> some_cont;

затем измените все some_cont-> на some_cont. и удалите delete some_cont (контейнер будет уничтожен, когда main выйдет автоматически.

Преимущество для таких действий:

  1. Вам не нужно помнить, чтобы удалить контейнер, и
  2. Вам не нужно делать дорогостоящее выделение памяти заранее.

Также гораздо сложнее в C ++ поместить вещи в автоматическое хранилище.

2 голосов
/ 08 июня 2011

Нет, вам не нужно явно очищать set перед уничтожением set.

OTOH, у вас есть ряд других проблем, начиная от паршивого (Java-подобного) дизайна, до неправильного синтаксиса, до пропущенного оператора и множества потенциальных утечек памяти. В то время как некоторые разработки могут иметь смысл в Java или C #, в C ++ это действительно плохая идея. Как только мы избавимся от самых вопиющих проблем, у нас останется что-то вроде этого:

#include <set>

struct SomeStruct 
{
    int a;
    SomeStruct(int i) : a(i) {}
    bool operator<(SomeStruct const &other) const { return a < other.a; }
};

int main ()
{
    std::set<SomeStruct> some_cont;

    for (int i = 0 ; i < 1000; i ++)
    {
        SomeStruct tmp(i);
        some_cont.insert(tmp);
    }
    return 0;
}
1 голос
/ 08 июня 2011

Нет, это не так, это будет сделано автоматически в деструкторе набора.

0 голосов
/ 08 июня 2011

Контейнеры STL автоматически освобождают любую память, которой они владеют.Так что в вашем случае место, отведенное для хранения вашего SomeStruct *, будет освобождено деструктором set.Обратите внимание, что деструктор set не вызывает никаких деструкторов SomeStruct, поэтому хорошо, что вы перебираете их, чтобы удалить их самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...