Я работаю над частью кода, в которой есть много возможных точек сбоя, из-за которых он рано выходит из функции. Библиотеки, с которыми я взаимодействую, требуют, чтобы массивы в стиле 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 []
. Я просто не увидел утечек памяти и решил пойти с этим. Даже не думал использовать вектор. Так как я в последнее время углубляюсь в новый (для меня) C ++, я думаю, что у меня есть случай «Если единственный инструмент, который у вас есть, это молоток, все выглядит как гвоздь». синдром. Спасибо за отзыв.
ОБНОВЛЕНИЕ2 Я решил изменить вопрос и дать ответ, чтобы он стал немного более ценным для того, кто совершил ту же ошибку, что и я. Хотя есть альтернативы, такие как 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.
}