В моем коде я выделяю целочисленный массив, используя 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;
}
Массив будет не быть удаленным правильно. auto_ptr
использования delete contained_item;
, Для массива нужно будет использовать delete [] contained_item;
вместо. Результатом является неопределенное поведение.
Как сказал Джеймс МакНеллис, вы действительно хотите std::vector
здесь — нет new
нет auto_ptr
и не беспокойтесь.
Вы не можете использовать std :: auto_ptr для обработки динамических массивов, потому что он не может знать, как различать delete и delete [].
Более того, auto_ptr
устарела, в C ++ 11 вы можете использовать std::unique_ptr
с:
int *array = new int[2];
std::unique_ptr<int[]> pointer(array);
Как говорили другие, auto_ptr — неправильная вещь, лучше использовать std :: vector. Но вы также можете использовать boost :: scoped_array. Но учтите, что вы хотите выполнить сброс во время создания, иначе вы можете также использовать delete.
pointer.reset (new int [2]);
или еще лучше, как это boost :: scoped_array arr (new int [2]);
Также нет смысла создавать статический указатель std :: auto_ptr; в глобальном масштабе.
Это означает, что он будет удален только тогда, когда программа существует, что произойдет в любом случае, даже если вы потеряете память.