我正在处理一段代码,它有许多可能的故障点,导致它提前退出函数。我正在与之交互的库要求将 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++,我想我有一个案例“如果你拥有的唯一工具是锤子,那么一切看起来都像钉子”。综合征。感谢您的反馈。
UPDATE2我想我会改变这个问题并提供一个答案,让它对犯我同样错误的人更有价值。尽管有scoped_array
,shared_array
和之类的替代方法vector
,但您可以使用 ashared_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.
}