gpt4 book ai didi

C++ 应用程序 : How to properly delete/release an allocated object?

转载 作者:太空狗 更新时间:2023-10-29 19:57:05 26 4
gpt4 key购买 nike

我在 Ubuntu 14.04 上使用 GCC 编译器。
我有一个小型通讯应用程序(不是我写的),我打算将它嵌入到我自己的应用程序中。
小通讯。应用代码如下所示:

UartComm * commInterface;   
...
void commInit()
{
commInterface = new UartComm;
}

// other functions here that use "commInterface"
// ...

int main()
{
commInit();
...
if(smthing_1)
return (-1);
if(smthing_2)
return (-2);
...
if(smthing_n)
return (-n);
//
return (0);
}

--
如上所示,原始代码中没有 delete commInterface; 因此,如果我将上述代码嵌入到我的应用程序中,请将 main() 重命名为 commFunction() 并多次调用它,我将有很多未分配的内存。
上面的代码是一个简化版本。事实上,代码有很多退出点/返回点。它还具有一些抛出异常的函数(我不是 100% 确定它们都被正确捕获和处理)。
所以,我想在所有 returns 之前添加 delete commInterface; 在这种情况下是不够的...
因此,我的问题是:有没有办法正确删除/释放 commInterface 以便嵌入和使用上述模块而不用担心内存泄漏?可能是智能指针或其他一些想法...?
两点说明:
1) 我已启用 C++11;
2) 我没有使用(也不想使用)boost
预先感谢您的时间和耐心等待。

最佳答案

以我的拙见,这是一个 global variables 的方案是要避免的。使用智能指针完成RAII特别是 std::unique_ptr通过以下方式:

int commFunction() {
auto commInterface = std::make_unique<UartComm>();
...
if(smthing_1)
return (-1);
if(smthing_2)
return (-2);
...
if(smthing_n)
return (-n);
//
return (0);
}

不过请注意 std::make_unique是 C++14,或者对于 C++11 使用以下内容:

std::unique_ptr<UartComm> commInterface(new UartComm);

还请注意,使用建议的方案,每次调用 commFunction 时都会创建一个新的 UartComm 对象。如果 UartComm 的创建是一项昂贵的操作,或者如果您的设计需要重用单个 UartComm 对象,您可以使用 singleton pattern为您的 UartComm 对象。

关于C++ 应用程序 : How to properly delete/release an allocated object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41715354/

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