首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

make shared_ptr不使用delete

在C++中,std::shared_ptr是一种智能指针,它提供了自动内存管理,允许多个指针共享同一个对象。当最后一个指向对象的shared_ptr被销毁或超出作用域时,对象将自动删除。

make_shared是C++11引入的一个工具函数,用于创建shared_ptr实例。它可以帮助您更高效地创建对象,并避免在创建过程中可能出现的内存泄漏问题。

在这个问答内容中,提到了make shared_ptr,但没有提到delete。这是因为make_shared会自动处理内存管理,您不需要手动删除对象。

以下是使用make_shared创建shared_ptr的示例代码:

代码语言:cpp
复制
#include<iostream>
#include<memory>

int main() {
    std::shared_ptr<int> ptr = std::make_shared<int>(42);
    std::cout << "Value: " << *ptr<< std::endl;
    return 0;
}

在这个示例中,我们使用make_shared创建了一个shared_ptr,指向一个int类型的对象,该对象的值为42。当程序结束时,对象会自动删除,您无需手动删除它。

总之,在使用std::shared_ptr时,您可以使用std::make_shared来创建它,这样可以更高效、更安全地管理内存。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

小弟问我:为什么MySQL建议使用delete删除数据?

这篇文章我会从InnoDB存储空间分布,delete对性能的影响,以及优化建议方面解释为什么建议delete删除数据。 InnoDB存储架构 ?...页分裂导致页面的利用空间少于50%,另外对表进行增删改会引起对应的二级索引值的随机的增删改,也会导致索引结构中的数据页面上留下一些"空洞",虽然这些空洞有可能会被重复利用,但终究会导致部分物理空间未被使用...同时,即便是设置了填充因子为100%,Innodb也会主动留下page页面1/16的空间作为预留使用(An innodb_fill_factor setting of 100 leaves 1/16 of...数据来对表进行瘦身是不现实的,所以在任何时候不要用delete去删除数据,应该使用优雅的标记删除。...另外一个比较好的方案采用Clickhouse,对有生命周期的数据表可以使用Clickhouse存储,利用其TTL特性实现无效数据自动清理。

4.2K21

delete in子查询走索引?!

但是如果把delete换成select,就会走索引。如下: 为什么select in子查询会走索引,delete in子查询却不会走索引呢?...原因分析 select in子查询语句跟delete in子查询语句的不同点到底在哪里呢?...但是很遗憾,对于delete in子查询,MySQL却没有对它做这个优化。 优化方案 那如何优化这个问题呢?通过上面的分析,显然可以把delete in子查询改为join的方式。...实际上,对于update或者delete子查询的语句,MySQL官网也是推荐join的方式优化 其实呢,给表加别名,也可以解决这个问题哦,如下: explain delete a from account...因此,加别名就可以让delete in子查询走索引啦! 总结 本博文分析了delete in子查询走索引的原因,并附上解决方案。

2.6K40

智能指针(一)

,new返回空指针 new申请的指针如果delete就会一直存在,并且delete只对当前的指针有效,即如果存在其他指针也指向了被释放的地址时,程序同样会出错,甚至可能之后又delete了已经被释放的对象...,则进行接管;如果q为unique_ptr,则接过所有权,将q置空 shared_ptr p //空shared_ptr使用delete释放 shared_ptr p(q,d) /...所以使用make_shared创建比较好,可以避免这种问题。 p.get()操作 p.get()的设计目的是当需要向不能用智能指针的地方传递一个内置指针时使用。...所管理的对象,但是控制对象的生存期,不改变引用计数。...w对象的shared_ptr weak_ptr需要用shared_ptr进行初始化,但是不能用make_shard,比如: auto a = make_shared(0); weak_ptr<

83610

善用shared_ptr,远离内存泄漏(文末福利)

>("hello");//sp1是一个智能指针 shared_ptr sp2(new int(42)); 而make_shared方式是推荐的一种,它使用一次分配,比较安全。...而与这种情况类似的,就是使用get()获取裸指针,然后去初始化另外一个shared_ptr,或者delete get返回的指针: //来源:公众号【编程珠玑】 #include #include...*/ delete p;/*不要这样做*/ return 0; } 如果对象不是new分配的,请传递删除器 与unique_ptr类似,它可以指定删除器,默认是使用delete。...另外,shared_ptr无法直接处理数组,因为它使用delete来销毁对象,而对于数组,需要用delete[]。...总结 以上就是shared_ptr基本内容,一般来说,规范使用shared_ptr能很大程度避免内存泄露。注意,shared_ptr提供,*,->操作,直接提供指针运算和[]。

1.6K10

【C++】智能指针详解

make_shared函数: 最安全的分配和使用动态内存的方法就是调用一个名为make_shared的标准库函数,此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr。... p4 = make_shared(10,'9'); shared_ptr p5 = make_shared(); make_shared用其参数来构造给定类型的对象...,如果我们传递任何参数,对象就会进行值初始化 shared_ptr的拷贝和赋值 当进行拷贝和赋值时,每个shared_ptr都会记录有多少个其他shared_ptr指向相同的对象。...使用new和delete管理动态内存常出现的问题: (1)忘记delete内存 (2)使用已经释放的对象 (3)同一块内存释放两次 delete之后重置指针值 在delete之后,指针就变成了空悬指针...(2)delete get()返回的指针 (3)不使用get()初始化或reset另一个智能指针 (4)如果你使用get()返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了

80330

C++(STL):03---智能指针之shared_ptr

make_shared(); 配合auto使用make_shared函数可以赋值给auto,这样比较简单 auto p=make_shared>(); 三、shared_ptr...此函数的设计情况:我们需要向不能使用智能指针的代码传递一个内置指针 get函数将内存的访问权限传递给一个指针,但是之后代码不会delete该内存的情况下,对get函数的使用才是最安全的 永远不要用get...//使用这个连接//当f函数退出或者异常退出,p都会调用end_connection函数} 十二、shared_prt与动态数组的使用 与unique_ptr不同,shared_ptr直接支持管理动态数组...如果希望使用shared_ptr管理动态数组,必须提供自己定义的删除器 如果未提供删除器,shared_ptr默认使用delete删除动态数组,此时delete少一个“[]”,因为会产生错误 //本例中... sp2(new int[3]{1,2,3}, [](int *p) { delete[] p; }); sp2.reset(); //使用自己书写的lambda释放数组 动态数组的访问:shared_ptr

1.5K20

动态内存与智能指针

shared_ptr p3 = make_shared(42); //初始化p3 指向一个值为42的int类型 shared_ptr p4 = make_shared...在这种情况下应该确保使用earse删除某些不再需要的shared_ptr 元素 直接管理内存 相对与智能指针直接使用new 和 delete很容器出错。...这样就给使用者造成了一个额外的负担,调用者必须记得释放内存。 使用new和delete 管理动态内存存在三个常见问题: 忘记delete内存。造成内存泄漏问题 使用已经释放掉的对象。...为了方便的使用智能指针,我们必须坚持一些基本原则: 不使用相同的内置指针初始化多个智能指针 delete get函数返回的指针 不使用get初始化或者reset另一个指针指针 如果使用get返回的指针...[] 销毁其指针 shared_ptr 直接支持管理动态数组。

82520

Chapter 4: Smart Pointers

p,无法知道是该使用 delete 还是其他析构机制来销毁 p 如果是使用 delete 来销毁 p,无法知道是该使用 delete 还是 delete[] 来销毁 p 即便知道了具体的销毁方式,很难保证在所有的代码路径上只销毁了一次...Use std::unique_ptr for exclusive-ownership resource management 默认情况下(传入自定义析构器时), std::unique_ptr 和原始指针大小一样...std::shared_ptr 指向了该对象,因此需要设定如下规则: std::make_shared 函数总是创建一个控制块 用一个独占使用权的指针(例如: std::unique_ptr 和 std... spw2(new Widget); 使用 std::make_XX 函数可以做到异常安全 void processWidget(std::shared_ptr<Widget...,而实际需要的是对象大小加上控制块大小后的内存,因此使用 std::shared_ptr 构造函数不可行,而使用 std::make_shared 函数就无法使用类自定义的 new 和 delete 运算

1.6K20

C++核心准则C.127:包含虚函数的类应该有虚析构函数或保护析构函数‍

包含虚函数的类通常(大多数情况下)通过指向基类的指针使用。通常,最后一个使用者必须通过指向基类的指针调用delete操作,通常是指向基类的智能指针,因此析构函数应该是公开的虚函数。...稍微特殊一些的情况是:如果希望支持通过指向基类的指针销毁对象,析构函数应该是保护的非虚函数。参见C.35。...: std::shared_ptr p = std::make_shared(args); Here, the shared pointer will take care of deletion...也有一些人计划只通过shared_ptr使用类:std::shared_ptr p= std::make_shared(args);这段代码中共享指针会负责对象的销毁,因此不会因为不适当的销毁操作而引起内存泄露...但是准则还是重要的--如果某人使用make_unique申请内存会怎么样?

75220

智能指针-使用、避坑和实现

独占的意思就是共享,所有权可以转移,但是转移之后,所有权也是独占。auto_ptr和unique_ptr就是一种独占所有权方式的智能指针。...int *ptr){delete []ptr;}); 使用 仍然以一段代码来说明,毕竟代码更有说服力。... t(a); delete a; } 一般情况下,生成的指针都要显式调用delete来进行释放,而上述这种,很容易稍不注意就调用delete;非必要不要使用get()获取原生指针。...,都需要操作引用计数 内存占用上小于shared_ptr shared_ptr需要维护它指向的对象的线程安全引用计数和一个控制块,这使得它比unique_ptr更重量级 使用make_shared初始化...从上面分析我们可以看出,第一种初始化方式(new方式)共有两次内存分配操作,而第二种初始化方式(make_shared)只有一次内存申请,所以建议使用make_shared方式进行初始化。

84510
领券