Я работаю над секцией кода, которая имеет много возможных точек отказа, из-за которых она рано выходит из функции. Библиотеки, с которыми я взаимодействую, требуют, чтобы массивы C-стиля были переданы в функции. Поэтому вместо вызова delete на массивах в каждой точке выхода я делаю это:
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength]);
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}
Я хотел использовать unique_ptr
, но мой текущий компилятор не поддерживает его, и в этом случае накладные расходы ссылочного значения не имеют большого значения.
Мне просто интересно, есть ли у кого-нибудь мысли об этой практике при взаимодействии с устаревшим кодом.
ОБНОВЛЕНИЕ Я полностью забыл о вызове shared_ptr
delete
вместо delete []
. Я просто не видел утечек памяти и решил пойти с ним. Даже не думал использовать вектор. Поскольку я в последнее время вникал в новый (для меня) С++, я думаю, что у меня есть случай "Если у вас единственный инструмент, это молот, все выглядит как гвоздь". синдром. Спасибо за отзывы.
UPDATE2 Я решил, что изменил бы вопрос и предоставил бы ответ, чтобы сделать его немного более ценным для тех, кто совершил ту же ошибку, что и я. Хотя есть альтернативы типа scoped_array
, shared_array
и vector
, вы можете использовать shared_ptr
для управления областью массива (но после этого я понятия не имею, почему я хочу):
template <typename T>
class ArrayDeleter
{
public:
void operator () (T* d) const
{
delete [] d;
}
};
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength], ArrayDeleter<char>());
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}