Как правильно использовать 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.