- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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/
我是一名优秀的程序员,十分优秀!