Добавьте элементы и очистите вектор указателей в C ++ - PullRequest
3 голосов
/ 26 июля 2010

Я хотел бы добавить 2 элемента к vector<Node*>, а затем очистить все элементы и освободить память.
Правильно ли этот код делает?

#include <stdlib.h>
#include <iostream>
#include <vector>

using namespace std;

class Node {
public:
    int value;
    // ...and some other fields and methods...
};

int main(int argc, char** argv) {
    Node* n = new Node;
    n->value = 20;
    vector<Node*> v;
    v.push_back(n);
    n = new Node;
    n->value = 52;
    v.push_back(n);
    for (vector<Node*>::iterator i = v.begin(); i != v.end(); i++) {
        cout << (*i)->value << endl;
        delete *i;
        *i = NULL;
    }
    v.clear();
    return (EXIT_SUCCESS);
}

Ответы [ 3 ]

8 голосов
/ 26 июля 2010

Это выглядит хорошо для меня.Есть несколько вещей, которые я бы изменил (субъективно):

*i = NULL;  // This is unnecessary.

Тогда я бы избегал повторного использования n (на самом деле, я бы избегал этого полностью):

v.push_back(new Node);
v.back()->value = 20;
v.push_back(new Node);
v.back()->value = 52;

Кроме того, вы можете рассмотреть возможность использования интеллектуальных указателей для отслеживания вашей памяти за вас.См. shared_ptr и ptr_vector .

5 голосов
/ 26 июля 2010

Это будет делать то, что вы ожидаете.Тем не менее, clear() совершенно не требуется, так как vector будет уничтожен сразу после этого, когда вы покинете текущую область (которая в данном случае также является концом функции и концом программы).Если вы планируете сохранить vector, чтобы сделать больше с ним, то clear() удалит все указатели из vector.На самом деле, vector уничтожается сразу после этого, поэтому нет смысла вызывать clear().

Кроме того, я хочу сказать, что вы должны использовать ++i в циклеиз i++, поскольку i++ создает временную переменную, которую компилятор не может оптимизировать (поскольку вы имеете дело с перегруженным оператором).Кроме того, поскольку вы просто собираетесь уничтожить vector сразу после удаления всего содержимого, нет смысла устанавливать все его элементы на NULL.Если вы собираетесь повторно использовать элементы, а не очищать или уничтожать vector, тогда это будет хорошей идеей.Но в этом случае это просто неэффективно.

3 голосов
/ 26 июля 2010

Да, это работает.

Некоторые замечания:

  • Вместо включения stdlib.h эквивалентом c ++ является cstdlib.
  • Ваш вектор может быть vector<Node>, если вам не нужны указатели; и было бы лучше использовать умные указатели, если они вам нужны.
...