new 和 make_shared 在内存上的区别 | C & C++

先 new 然后赋值的方式,会导致内存碎片化;make_shared 的方法分配内存,不会导致内存产生过多的碎片。

1
2
T* pt = new T;
std::shared_ptr<T> p(pt);

上面这段代码是先在堆上分配一块内存,然后在堆上再建一个智能指针控制块,这两个东西是不连续的,会造成内存碎片化

1
std::shared_ptr<T> p = std::make_shared<T>();

上面这段代码是直接在堆上新建一块足够大的内存,其中包含两部分,上面是内存(用来使用),下面是控制块(包含引用计数)。然后用 T 的构造函数去初始化分配的内存(分配一块内存的步骤:先分配内存,再进分配的内存调用构造函数进行构造,构造完毕才能使用)。

参考

new 和 make_shared 在内存上的区别

new 和 make_shared 在内存上的区别 | C & C++

http://www.zh0ngtian.tech/posts/ba71e1e4.html

作者

zhongtian

发布于

2022-04-30

更新于

2023-12-16

许可协议

评论