Как правильно использовать auto_ptr для динамически размещаемых массивов?

Если я использую auto_ptr для хранения указателя на динамически распределенный массив, когда auto_ptr будет убит, он будет использовать обычную операцию удаления, а не delete[], таким образом, не удаляя мой выделенный массив.

Как я могу (правильно) использовать auto_ptr для динамически распределяемых массивов?

Если это невозможно, есть ли другая альтернатива интеллектуального указателя для динамически размещаемых массивов?

Заранее спасибо.

5 ответов

Решение

boost::shared_array - это то, что вы ищете.

РЕДАКТИРОВАТЬ:

Если вы хотите избежать использования наддува, я бы рекомендовал просто использовать std::vector они находятся под массивом, и нет необходимости беспокоиться о распределении памяти. На самом деле это лучшее решение, чем shared_array тем не мение.

Поскольку вы указываете, что вы хотели использовать auto_ptr тогда вам не нужна модель подсчета ссылок и владения shared_array, Так что просто используйте std::vector, так как они адаптированы для замены динамически размещаемых массивов, и это действительно то, чем вы пытаетесь управлять с помощью auto_ptr,

Вы не std::auto_ptr не предназначен для использования с массивами.

Избегать использования new[] а также delete[], использование std::vector вместо. Это рекомендация Страуструпа тоже.

Если вы используете массив, потому что вам нужно передать его в код, который ожидает указатель, вы можете просто передать вместо него адрес первого элемента (непустого) вектора. Например:

std::vector<char> buf(size);
fgets(&buf[0], buf.size(), stdin);

Обратите внимание, что в C++11 вы можете (и должны) использовать buf.data() вместо &buf[0]; buf.data() работает на пустом векторе тоже.

Правильный интеллектуальный указатель Boost в этом случае - boost:: scoped_array, а не более известный boost::shared_array, потому что std::auto_ptr является указателем единоличного владения. Противоположность указателя совместного владения. В C++0x правильный указатель std::unique_ptr, который вызовет delete[], если он указывает на массив, или delete, если он указывает на один объект.

Если вы хотите сделать это самостоятельно (т.е. не использовать boost), то сначала оберните динамический массив в класс. Пусть вызов деструктора класса delete[], Тогда auto_ptr<Wrapper> может позвонить delete на класс и память будет освобождена должным образом.

Правильный способ использования auto_ptr (с динамически размещаемым массивом или чем-то еще) - использовать вместо этого что-то еще. Либо boost::shared_array, либо shared_ptr>, либо shared_ptr> из TR1 в вашем случае. В общем случае shared_ptr или unique_ptr - это умные указатели, которые на самом деле умные. Прекратить использование auto_ptr.

Другие вопросы по тегам