gpt4 book ai didi

c++ - 您可以将 shared_ptr 用于 C 样式数组的 RAII 吗?

转载 作者:IT老高 更新时间:2023-10-28 12:52:32 26 4
gpt4 key购买 nike

我正在处理一段代码,其中有许多可能的故障点,导致它提前退出函数。我正在与之交互的库要求将 C 样式的数组传递给函数。因此,我没有在每个退出点对数组调用 delete,而是这样做:

void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength]);
pArray = raiiArray.get();

if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }

//etc.
}

我想使用 unique_ptr,但我当前的编译器不支持它,并且在这种情况下引用计数开销并不重要。

我只是想知道在与遗留代码交互时是否有人对这种做法有任何想法。

UPDATE我完全忘记了 shared_ptr 调用 delete 而不是 delete []。我只是看到没有内存泄漏并决定使用它。甚至没有想到使用 vector 。由于我最近一直在研究新的(对我而言)C++,我想我有一个案例“如果你拥有的唯一工具是锤子,那么一切看起来都像钉子”。综合征。感谢您的反馈。

UPDATE2 我想我会改变这个问题并提供一个答案,让它对犯我同样错误的人更有值(value)。虽然有 scoped_arrayshared_arrayvector 等替代方法,但您可以使用 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.
}

最佳答案

不要使用 shared_ptrscoped_ptr 来保存指向动态分配数组的指针。 shared_ptr 和 scoped_ptr 使用 delete ptr; 在指针不再被引用/超出范围时进行清理,这会在动态分配的数组上调用未定义的行为。而是使用 shared_array 或 scoped_array,它们在析构时正确使用 delete[] ptr;

要回答您的问题,如果您不打算传递智能指针,请使用 scoped_array,因为它的开销比 shared_array 少。

或者,使用 std::vector 作为数组存储( vector 保证连续的内存分配)。

关于c++ - 您可以将 shared_ptr 用于 C 样式数组的 RAII 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com