2014-01-23 3 views
0

Я думаю, что задаю вопрос, который может уже иметь ответ here, но я боюсь, что не смог понять его на связанной странице.автоматическая обработка мусора в C++

Я делаю связанный список в C++ и сканирую их с самого начала, пока указатель на следующий элемент в списке не будет равен нулю. После некоторого полного мусора (на этот раз метафорически) для нашего, я понял, я забыл установить указанный указатель на последний элемент явно на NULL, потому что я думал, что неустановленный указатель по умолчанию равен нулю.

Я знаю, что unset values ​​в C/++ по умолчанию по умолчанию содержит мусор, который вызывает проблемы, как в этом случае, но мне интересно, есть ли способ автоматически установить их в null, на случай, если я забуду это сделать ? Я не нашел много информации в веб-поиске.

Извините, если вопрос довольно новичок.

+0

['std :: unique_ptr '] (http://en.cppreference.com/w/cpp/memory/unique_ptr) должен сделать это за вас. – Borgleader

+0

Возможно, вы захотите прочитать интеллектуальные указатели, например. на http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one –

+0

полуавтоматизирован: инициализируется в конструкторе, очищается в деструкторе. – stefaanv

ответ

3

Вы можете использовать always_initialized<T> шаблон или в C++ 11 инициализаторы нестатических данных и равномерная инициализация.

// C++11: 
struct Node { 
    T value; 
    Node* next = {}; 
}; 
// C++03: 
template<typename T> struct always_initialized { 
    T member; 
    always_initialized(T t) : member(t) {} 
    always_initialized() : member() {} 
    // Copy operators and utilities 
}; 
struct Node { 
    T value; 
    always_initialized<Node*> next; 
}; 

Однако в данном конкретном случае, было бы лучше использовать unique_ptr<T>, поскольку он может автоматически обрабатывать гораздо больше, чем просто нуль на строительство по умолчанию по умолчанию для вы- он также может очистить свои ресурсы.

+0

спасибо. Я выбираю это как ответ, потому что он кажется первым, а также упоминает два метода. always_initialized и unique_ptr. – Sean

1

Я настоятельно рекомендую использовать std::unique_ptr, однако вы всегда можете установить его в конструкторе вашего узла:

struct Node { 
    Node(T val) : value(val), next(NULLPTR) {} 
    T value; 
    Node * next; 
}; 

.... 
last->next = new Node(val); 

или C++ 11 версия:

struct Node { 
    T value; 
    Node * next; 
}; 

.... 
last->next = new Node{std::move(val), nullptr}; 
+0

спасибо, это работает – Sean

Смежные вопросы