gpt4 book ai didi

c++ - 将共享指针与在另一个函数中分配的内存一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:56 25 4
gpt4 key购买 nike

我有一些遗留时代的代码在工作,它接收一个双指针并为其分配内存。它的一个简短示例如下所示:

struct LegacyObj
{
int a;
double b;
};

void LegacyAllocator(LegacyObj** ppObj)
{
*ppObj = (LegacyObj*)malloc(sizeof(LegacyObj));
}

void LegacyDeleter(LegacyObj** ppObj)
{
free(*ppObj);
}

实际的 LegacyAllocator 函数大约有 100 行,混合了从文件中读取和创建 LegacyObj 指针的链表的功能,我现在无法通过重写来解决这个问题。然而,我想使这个函数的使用更安全一些,避免异常 &tc 可能导致的任何内存泄漏。我想出的第一个解决方案是将其包装在一个类中,并处理调用 ctor/dtor 中的遗留函数。

class RAIIWrapper
{
public:
RAIIWrapper()
:obj{nullptr}
{
::LegacyAllocator(&obj);
}
RAIIWrapper(RAIIWrapper&& that)
: obj{ that.obj}
{
that.obj = nullptr;
}
RAIIWrapper& operator=(RAIIWrapper&& that)
{
RAIIWrapper copy{std::move(that)};
std::swap(obj, copy.obj);
return *this;
}
~RAIIWrapper ()
{
::LegacyDeleter(&obj);
}

private:
LegacyObj* obj;
};

但我很好奇 - 有没有办法使用 std::shared_ptrstd::unique_ptr 来做到这一点?如果不保留传递给 LegacyAllocator 的原始指针,我无法提出解决方案。

最佳答案

是的,您可以将自定义删除器与 std::unique_ptr 结合使用或 std::shared_ptr ,例如:

struct Deleter {
void operator()(LegacyObj *p) const {
LegacyDeleter(&p);
}
};

std::unique_ptr<LegacyObj, Deleter> MakeLegacyObj() {
LegacyObj *p = 0;
LegacyAllocator(&p);
return std::unique_ptr<LegacyObj, Deleter>(p);
}

std::unique_ptr<LegacyObj, Deleter> p = MakeLegacyObj();

而且,正如@Dave 正确指出的那样,这也适用于 shared_ptr:

std::shared_ptr<LegacyObj> p = MakeLegacyObj();

关于c++ - 将共享指针与在另一个函数中分配的内存一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20685185/

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