现代C++中可以使用 std::make_shared / std::make_unique创建两种类型的智能指针,为什么要这样设计的呢?或者说这样设计有什么好处呢?为什么不使用一个裸指针或者直接new的形式进行创建呢? 异常安全 这个在C++17之前没有保证,但是在C++17之后就保证了,(但是贵司的C++版本万一还是C++11呢(bushi)),C++的参数求值顺序...
1. make_unique 同 unique_ptr 、auto_ptr 等一样,都是 smart pointer,可以取代new 并且无需 delete pointer,有助于代码管理。 2. make_unique 创建并返回 unique_ptr 至指定类型的对象,这一点从其构造函数能看出来。make_unique相较于unique_ptr 则更加安全。 3. 编译器不同,make_unique 要求更新(Visual ...
1.使用make_shared的时候widget只写了一次, 2.当遇到函数传参时,由于编译器执行顺序的不同,如果使用shared_ptr这种方式,当new widget之后,后面的参数函数执行然后出现异常导致程序退出,此时就会出现内存泄漏。 比如: intfunc(std::shared<widget>(newwidget),compute()) 可以分开 std::shared<widget> p(new widge...
第三个make函数是std::allocate_shared,它的作用类似于std::make_shared,只不过它的第一个参数是用于动态内存分配的分配器。 我们将使用make函数和,不使用make函数做个最简单的比较,也能发现为什么使用make函数更可取。因为如果不使用make函数,需要这么创建智能指针: autoupw1(std::make_unique<Widget>());// wi...
make版本不需要显示的使用new, 如果是unique就使用make_unique,如果是shared就是用make_shared; 不依赖于显式new的这种方式,在库之间依赖的时候通常减少了很多bug出现 同时减少代码的大小 避免异常安全 对于函数 void invoke(shared_ptr memory, int value); ...
适用std::make_unique而不使用new的原因和使用std::make_shared的目的相同,都是出于写出异常安全(exception-safe)代码的考虑。 一个使用std::make_shared(和直接使用new相比)的显著特性就是提升了效率。使用std::make_shared允许编译器利用简洁的数据结构产生出更简洁,更快的代码。考虑下面直接使用new的效果 std::...
正确✅:推荐使用 make_unique unique_ptr<User>user=make_unique<User>("unique_ptr"); 错误❌:一个对象只允许被一个 unique_ptr 指向。 User*u=newUser("shared_ptr");unique_ptr<User>user1(u);unique_ptr<User>user2(u); 错误❌:unique_ptr 不支持拷贝 ...
【智能指针】std::unique_ptr 和weak_ptr 基本用法尽量使用std::make_unique和std::make_shared而不直接使用new,std::unique_ptrstd::unique_ptr是一种独占的语义,即只允许一个智能指针引用裸指针,这区别于std::shared_ptr允许多个shared_ptr引用同一个裸指针,它没有引
在C++11中,make_unique是一个工厂函数,用于创建并返回一个std::unique_ptr对象,该对象管理一个动态分配的对象。make_unique可以避免手动调用new和delete操作,从而避免内存泄漏和错误。 使用make_unique可以使代码更加简洁和安全,因为make_unique能够自动推导对象的类型,并且在分配内存失败时会抛出std::bad_alloc异常。同...