zoukankan      html  css  js  c++  java
  • 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);
    }
    
    
  • 相关阅读:
    hadoop_并行写操作思路_2
    hadoop_并行写操作思路
    Hadoop_Block的几种状态_DataNode
    KMP算法_读书笔记
    德才论
    换个格式输出整数
    继续(3n+1)猜想
    害死人不偿命的(3n+1)猜想
    c# number求和的三种方式
    c# 中的协变和逆变
  • 原文地址:https://www.cnblogs.com/ymd12103410/p/11131171.html
Copyright © 2011-2022 走看看