auto_ptr, указывающий на динамический массив

В моем коде я выделяю целочисленный массив, используя new. После этого я оборачиваю этот указатель на auto_ptr. Я знаю, что auto_ptr вызывает его деструктор автоматически. Так как мой auto_ptr указывает на массив (выделенный с помощью new), массив будет удален вместе с auto_ptr или это вызовет утечку памяти. Вот мой пример кода.

std::auto_ptr<int> pointer;

void function()
{
int *array = new int[2];
array[0] = 10;
array[1] = 20;

pointer.reset((int*) array);
}

int _tmain(int argc, _TCHAR* argv[])
{

function();
return 0;
}

4

Решение

Массив будет не быть удаленным правильно. auto_ptr использования delete contained_item;, Для массива нужно будет использовать delete [] contained_item; вместо. Результатом является неопределенное поведение.

Как сказал Джеймс МакНеллис, вы действительно хотите std::vector здесь — нет newнет auto_ptr и не беспокойтесь.

9

Другие решения

Вы не можете использовать std :: auto_ptr для обработки динамических массивов, потому что он не может знать, как различать delete и delete [].

Более того, auto_ptr устарела, в C ++ 11 вы можете использовать std::unique_ptr с:

int *array = new int[2];
std::unique_ptr<int[]> pointer(array);
9

Как говорили другие, auto_ptr — неправильная вещь, лучше использовать std :: vector. Но вы также можете использовать boost :: scoped_array. Но учтите, что вы хотите выполнить сброс во время создания, иначе вы можете также использовать delete.
pointer.reset (new int [2]);

или еще лучше, как это boost :: scoped_array arr (new int [2]);

Также нет смысла создавать статический указатель std :: auto_ptr; в глобальном масштабе.
Это означает, что он будет удален только тогда, когда программа существует, что произойдет в любом случае, даже если вы потеряете память.

1
По вопросам рекламы [email protected]