Немного про auto_ptr
auto_ptr – это… O Шаблонный класс, доступный в стандартной библиотеке C++ (объявленный в заголовочном файле ). Является одним из умных указателей.
Для чего нужны умные указатели? O Когда мы используем «сырые» указатели программист сам должен освобождать память, которую он выделяет при создании указателя. O Основная идея умных указателей освободит программиста от освобождения памяти, которое было выделено в куче.
Пример использования «сырого указателя» int main(int argc, char * argv[]) { // выделяем память int * ptr = new int(); // в ячейку по адресу ptr записываем число 10 *ptr = 10; // выводим число 10 на консоль std: : cout << *ptr << std: : endl; // очищаем память delete ptr; return 0; }
Пример использования auto_ptr int main(int argc, char * argv[]) { // выделяем память std: : auto_ptr ptr(new int()); // в ячейку по адресу ptr записывает число 10 *ptr = 10; // выводим число 10 на консоль std: : cout << * ptr << std: : endl; // освобождать веделенную память не нужно, // auto_ptr сам сделает это return 0; }
Не все так хорошо… O Есть один недостаток в auto_ptr имеет саморазрушающийся конструктор копирования. То есть после того как указатель присвоили какому–нибудь другому указателю, первый уничтожается.
Пример int main(int argc, char * argv[]) { std: : auto_ptr ptr 1(new int(1)); std: : auto_ptr ptr 2; ptr 2 = ptr 1; // здесь будет ошибка, так как ptr 1 пуст // он уничтожил сам себя после присвоения ptr 2 std: : cout << *ptr 1 << std: : endl; } return 0;
Еще пример void Print. Int(std: : auto_ptr i) { std: : cout << *i << std: : endl; } int main(int argc, char * argv[]) { std: : auto_ptr ptr 1(new int(1)); std: : auto_ptr ptr 2; Print. Int(ptr 1); // здесь будет ошибка, так как ptr 1 пуст // он уничтожил после того как скопировал себя в локальнуб переменную i // функции Print. Int std: : cout << *ptr 1 << std: : endl; } return 0;
Небольшой комментарий к последнему примеру O В последнем примере (с функцией Print. Int) проблему можно решить если передавать параметр по ссылке, то есть написать : O void Print. Int(std: : auto_ptr &i) O но это не помогает во всех случаях…
unique_ptr O Как решение можно использовать unique_ptr - это так умных указатель, очень похожий на auto_ptr. O В этом указателе конструктор копирования и оператор присвоения недоступны ( в классе они объявлены как приватные методы ). O Если реализовать предыдущие примеры, используя unique_ptr, то еще на стадии компиляции выявится ошибка.
auto_ptr и vector O Так же не следует использовать auto_ptr как элементы vector – а. Так как при любой операции присвоения потеряется элемент, находящийся в vector – е. O А как же без операций присвоения при работе с vector – ом?