Стандартные контейнеры STL помещают копию исходного объекта в контейнер, используя конструктор копирования. Когда контейнер уничтожен, деструктор каждого объекта в контейнере также вызывается для безопасного уничтожения объекта.
Указатели обрабатываются одинаково.
Дело в том, что указатели являются данными POD. Конструктор копирования для указателя просто копирует адрес, а данные POD не имеют деструктора. Если вы хотите, чтобы контейнер управлял указателем, вам необходимо:
- Используйте контейнер умных указателей. (например, общий указатель).
- Используйте контейнер с усиленным ptr.
Я предпочитаю указатель контейнера:
Контейнеры указателей такие же, как контейнеры STL, за исключением того, что вы помещаете в них указатели, но контейнер затем становится владельцем объекта, на который указывает указатель, и, таким образом, освобождает объект (обычно вызывая delete), когда контейнер уничтожается.
Когда вы обращаетесь к членам контейнера ptr, они возвращаются по ссылке, поэтому они ведут себя так же, как стандартный контейнер для использования в стандартных алгоритмах.
int main()
{
boost::ptr_vector<int> data;
data.push_back(new int(5));
data.push_back(new int(6));
std::cout << data[0] << "\n"; // Prints 5.
std::cout << data[1] << "\n"; // Prints 6.
} // data deallocated.
// This will also de-allocate all pointers that it contains.
// by calling delete on the pointers. Therefore this will not leak.
Следует также отметить, что интеллектуальные указатели в контейнере являются допустимой альтернативой, к сожалению, std :: auto_ptr <> не является правильным выбором интеллектуального указателя для этой ситуации.
Это связано с тем, что контейнеры STL предполагают, что содержащиеся в них объекты являются копируемыми, к сожалению, std :: auto_ptr <> не копируется в традиционном смысле, поскольку уничтожает исходное значение при копировании и, следовательно, источник копии не может быть Const.