區別:
先new然后賦值的方式,會導致內存碎片化
make_shared的方法分配內存,不會導致內存產生過多的碎片
A* a = new A; //①
std::shared_ptr<A> pa(a);
std::shared_ptr<A> pa1 = std::make_shared<A>(1); //②
通過①的方式,是先在堆上分配一塊內存,然后在堆上再建一個智能指針控制塊,這兩個東西是不連續的,會造成內存碎片化
通過②的方式,是直接在堆上新建一塊足夠大的內存,其中包含兩部分,上面是內存(用來使用),下面是控制塊(包含引用計數),然后用A的構造函數去初始化分配的內存(分配一塊內存的步驟:先分配內存,再進分配的內存調用構造函數進行構造,構造完畢才能使用)
這里自己實現了一下分配內存,然后調用構造函數進行構造:
class A
{
public:
A() {}
A(int) {}
~A() {}
};
int main()
{
A* storge = (A*)malloc(sizeof A); //先分配內存
::new (storge) A; //使用placement new ,在已經分配好的內存上進行構造(初始化)
storge->~A();
free(storge);
}