Sup*_*eto 1 c++ memory-leaks smart-pointers unique-ptr
fn(unique_ptr<A>{new A{}},unique_ptr<B>{new B{}});
Run Code Online (Sandbox Code Playgroud)
很麻烦,因为A如果B在那里抛出异常,就会发生泄漏。
fn(make_unique<A>(),make_unique<B>());
Run Code Online (Sandbox Code Playgroud)
另一方面被认为是异常安全的。
为什么?使用make_unique如何防止内存泄漏?make_unique做了
哪些默认的unique_ptr没有做的事情?
请帮帮我。
谢谢。
在 C++ 中如何使用 make_unique 防止内存泄漏?
std::make_unique并不能“防止”内存泄漏,因为仍然有可能在使用的程序中编写内存泄漏std::make_unique.
这样做的目的std::make_unique是让编写没有内存泄漏的程序变得更容易。
如果 A 或 B 抛出异常,则会发生泄漏。
为什么?
C++17 之前版本:
因为如果你分配,然后在构造应该拥有的之前A调用构造函数,并且抛出的构造函数,那么将会泄漏(或者同样的情况发生在和Bstd::unique_ptrABAAB相反)。
从 C++17 开始:
不存在泄漏,因为在所示示例中上述情况不再发生。
make_unique 做了哪些默认的 unique_ptr 没有做的事情?
std::make_unique分配内存,并且要么成功返回有效的std::unique_ptr,要么抛出异常而不泄漏内存。
std::unique_ptr(T*)接受单独分配的指针。如果在调用构造函数之前引发异常,则永远不会有一个唯一的指针拥有该分配。
无需使用即可修复(C++17 之前的)错误std::make_unique:
auto a = std::unique_ptr<A>{new A{}};
auto b = std::unique_ptr<B>{new B{}};
fn(std::move(a), std::move(b));
Run Code Online (Sandbox Code Playgroud)
但如果你总是使用std::make_unique,那么你就不会意外地犯下编写泄漏版本的错误。此外,std::make_unique让您避免编写new,这允许您使用经验法则“为每个新内容准确地编写一个删除”。0 新增 -> 0 删除。
| 归档时间: |
|
| 查看次数: |
884 次 |
| 最近记录: |