new 和 make_shared 在内存上的区别 | C & C++
先 new 然后赋值的方式,会导致内存碎片化;make_shared 的方法分配内存,不会导致内存产生过多的碎片。
1 | T* pt = new T; |
上面这段代码是先在堆上分配一块内存,然后在堆上再建一个智能指针控制块,这两个东西是不连续的,会造成内存碎片化
1 | std::shared_ptr<T> p = std::make_shared<T>(); |
上面这段代码是直接在堆上新建一块足够大的内存,其中包含两部分,上面是内存(用来使用),下面是控制块(包含引用计数)。然后用 T 的构造函数去初始化分配的内存(分配一块内存的步骤:先分配内存,再进分配的内存调用构造函数进行构造,构造完毕才能使用)。
参考
new 和 make_shared 在内存上的区别 | C & C++