new 和 make_shared 在內存上的區別


區別:

先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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM