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

转载于:https://www.cnblogs.com/ymd12103410/p/11131171.html

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
make_sharednew在分配和初始化动态内存时有一些区别make_shared在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。它可以通过传递参数给构造函数来初始化对象。make_shared定义在头文件memory中。它的优点是可以减少内存分配和对象构造的次数,提高性能。同时,make_shared还可以自动销毁对象并释放内存,无需手动管理。 而new则是用于在动态内存中分配一个对象,并返回指向该对象的指针。使用new需要手动管理内存,包括手动析构对象和释放内存。它需要使用delete或delete[]来释放对象和内存new可以用于分配单个对象,也可以用于分配数组。但是new分配的内存可能会导致内存碎片产生。 总结来说,make_shared可以简化动态内存分配和对象初始化的过程,并且自动管理内存的释放。而new需要手动管理内存,并且可能导致内存碎片的产生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [shared-ptr(智能指针)举例.pdf](https://download.csdn.net/download/qq_43934844/87504633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [[modern c++] std::make_shared 和 std::shared(new)的区别](https://blog.csdn.net/ykun089/article/details/121787439)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [newmake_shared内存上的区别](https://blog.csdn.net/anna2117/article/details/101802846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值