并且如果computePriority先被调用并产生一个异常,std::make_shared就不会被调用,因此这里就不需要考虑动态分配的Widget了。 如果使用std::unique_ptr和std::make_unique来替换std::shared_ptr和std::make_shared,事实上,会用到同样的理由。因此,使用std::make_unique代替new就和“使用std::make_shared来写出异常安...
std::make_shared已经完成了对Widget对象的构造,并且std::shared_ptr也已经被正确初始化,可以管理这块内存。接着调用computePriority()来计算优先级。如果computePriority()抛出异常,由于std::make_shared已经成功创建了std::shared_ptr,并且这个智能指针已经开始管理Widget对象,所以在异常处理过程中,std::shared_ptr的析...
如果首先调用computePriority并产生一个异常,std::make_shared将不会被调用,因此将不需要担心动态分配的Widget。 如果我们将std::shared_ptr和std::make_shared换成std::unique_ptr和std::make_unique,结果完全相同。因此,在编写异常安全代码时,也应该使用std::make_unique而不是new。 与直接使用new相比,std::make...
在runtime的时候,std::make_shared或者computePriority都有可能被第一次调用。如果是std::make_shared先被调用,被动态分配的Widget安全的存储在返回的std::shared_ptr中(在computePriority被调用之前)。如果computePriority产生了异常,std::shared_ptr的析构函数会负责把它所拥有的Widget回收。如果computePriority首先被调...
std::make_shared在内存分配和对象构造过程中提供了强异常安全性。如果在分配内存或构造对象时抛出异常,std::make_shared会自动处理已分配的内存,确保没有内存泄漏,并且不会部分构造对象。 使用new时,如果在分配内存后抛出异常,可能会导致内存泄漏,因为在异常抛出前分配的内存无法释放。
相比于直接使用new, std::make_unique和std::make_shared可以消除代码重复, 改进异常处理且生成的代码更小更快. 不适合使用std::make_X系列函数的情况包括需要指定自定义删除器和希望传递花括号初始列表. 对于std::shared_ptr, make 系列函数可能不明智的其他情况还包括 (1) 具有自定义内存管理的类(2) 有内存...
autox =std::make_shared<foo>(); return0; } 编译如下: g++ -std=c++11test.cpp <--OK clang++ -std=c++11test.cpp <--OK clang++ -std=c++11-stdlib=libc++ test.cpp <--FAIL 使用LIBC ++编译时,它会失败: /usr/bin/../include/c++/v1/memory:3793:7:error:exception specification of overr...
异常 在函数内部创建std::shared_ptr并在抛出异常前返回它时,如果异常处理逻辑不正确,可能会导致局部作用域内的std::shared_ptr被销毁,而外部代码可能还持有相关的原始指针,从而导致悬空指针。 为了解决这个问题,C++提出了std::weak_ptr。std::weak_ptr是一个与std::shared_ptr相关的类,它不会增加所指向对象的引...
cppCopy codeint* ptr = new int;// 使用ptr指向的内存...delete ptr; // 使用完毕后释放内存使用智能指针:C++11引入了智能指针,如std::shared_ptr...cppCopy codestd::shared_ptr ptr = std::make_shared();// 使用ptr指向的内存...// 当ptr超出作用域时,内存会自动释放避免内存泄漏的常...
如果您可以控制 struct MyStruct,请将其更改为 std::string 或 std::shared_ptr。如果没有,请坚持新建/删除恕我直言。它至少是可读且诚实的。 如果您可以控制范围 0 区域,请在那里使用 std::unique_ptr 。这是有道理的,因为您不必处理异常。如果您不知道那里需要的大小,请坚持新建/删除。