首页
学习
活动
专区
工具
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.5K21

    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.7K40

    智能指针(一)

    ,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<

    86210

    C++17 中对数组的支持:std::shared_ptr 的深入理解与使用

    创建和初始化 std::shared_ptr 数组主要有两种方式:使用 std::make_shared 或直接使用 new 表达式。...使用 new 表达式创建数组(不推荐)虽然可以直接使用 new 表达式来创建 std::shared_ptr 数组,但这种方式并不推荐。...以下是一个使用 new 表达式创建数组的示例:#include #include int main() { // 使用 new 表达式创建数组(不推荐)...注意数组的释放方式当使用 std::shared_ptr 管理数组时,确保使用正确的删除器(如 std::default_delete),以避免未定义行为。...如果删除器使用不当,可能会导致内存泄漏或程序崩溃。例如,在使用 new 表达式创建 std::shared_ptr 数组时,必须手动指定删除器为 std::default_delete。

    8800

    善用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.8K10

    【C++】指针与智慧的邂逅:C++内存管理的诗意

    被置空,访问会造成程序崩溃 ap2->_day; return 0; } auto_ptr 的设计存在缺陷,在在涉及资源所有权转移时,其行为会造成意外的错误,auto_ptr在C++11中被废弃,不推荐使用...Args> std::unique_ptr make_unique(Args&&... args); 与直接使用 new 操作符相比的优势: 避免手动调用 new 和 delete :使用 make_unique...//使用 make_unique 创建一个 int 类型的 unique_ptr(推荐) auto up1 = make_unique(20); //直接使用 unique_ptr(容易出错...Args> shared_ptr make_shared (Args&&... args); make_shared 与直接使用 shared_ptr 的对比 特性 make_shared 直接用...weak_ptr 是一种辅助智能指针,它与 shared_ptr 配合使用,用于解决循环引用问题或实现对象的非强拥有关系。 weak_ptr 是一种不参与引用计数的智能指针。

    8510

    【C++】智能指针的使用及其原理

    智能指针的使用场景分析 下⾯程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后⾯的delete没有得到 执⾏,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete...Args> shared_ptr make_shared (Args&&... args); shared_ptr 除了⽀持⽤指向资源的指针构造,还⽀持 make_shared ⽤初始化资源对象的值 直接构造...删除器通过构造函数传递,不参与模版参数类型,因此类型推导自动完成,实参传给形参模版自动推导类型,而unique_ptr是通过类声明的方式,删除器需在模板参数中指定类型,那要么就必须要传类型,使用lambda...不太方便因为lambda的类型很难获取,这里可以使用decltype来推导。...); 5.2 weak_ptr weak_ptr不⽀持RAII,也不⽀持访问资源,所以我们看⽂档发现weak_ptr构造时不⽀持绑定到资 源,只⽀持绑定到shared_ptr,绑定到shared_ptr

    13110

    C++ —— 以真我之名 如飞花般绚丽 - 智能指针

    _ptr = nullptr; } 2.3 简单模拟实现auto_ptr和unique_ptr的核心功能 auto_ptr的思路是拷贝时转移资源管理权给被拷⻉对象,这种思路是不被认可的,也不建议使用...Args> shared_ptr make_shared(Args&&... args) shared_ptr 除了⽀持⽤指向资源的指针构造,还⽀持 make_shared ⽤初始化资源对象的值...⽤计数不能使用静态成员的⽅式实现,因为静态的成员变量是属于整个类的所有对象,所以要使用堆上动态开辟的⽅式构造智能指针对象时来⼀份资源,就要new⼀个引⽤计数出来 多个shared_ptr指向资源时就...怎样才能使用delete[] 智能指针析构时默认是进⾏delete释放资源,这也就意味着如果不是new出来的资源,交给智能指针管理,析构时就会崩溃 // 这样实现程序会崩溃 unique_ptr使用 7.

    9710

    【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()返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了

    92430

    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.7K20

    【C++】智能指针

    1.智能指针的使用场景分析 下⾯程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后⾯的delete没有得到执⾏,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后...Args> shared_ptr make_shared (Args&&... args); shared_ptr 除了⽀持⽤指向资源的指针构造,还⽀持 make_shared...8 // 这⾥改成 weak_ptr ,当 n1->_next = n2; 绑定 shared_ptr 时 9 // 不增加 n2 的引⽤计数,不参与资源释放的管理,就不会形成循环引...持管理资源,不⽀持 RAII 33// weak_ptr 是专⻔绑定 shared_ptr ,不增加他的引⽤计数,作为⼀些场景的辅助管理 34//std::weak_ptr不⽀持绑定到资 源,只⽀持绑定到shared_ptr,绑定到shared_ptr时,不增加shared_ptr的引⽤计数,那么就可以 解决上述的循环引⽤问题。

    3400

    智能指针--C++

    一、智能指针的使用场景分析 下面程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后面的delete没有得到执行,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete...Args> shared_ptr make_shared (Args&&... args); shared_ptr 除了支持用指向资源的指针构造,还支持 make_shared 用初始化资源对象的值直接构造...> sp2 = make_shared(2024, 9, 11); auto sp3 = make_shared(2024, 9, 11); shared_ptr...auto_ptr的思路是拷贝时转移资源管理权给被拷贝对象,这种思路是不被认可的,也不建议使用。unique_ptr的思路是不支持拷贝。...shared_ptr时,不增加shared_ptr的引用计数,那么就可以解决上述的循环引用问题。

    4500
    领券