C++动态分配内存与智能指针(一)

 1、C++程序的内存分配与释放

         栈内存或者静态内存对象都有其严格的生命周期,静态内存用来保存局部的static对象、类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static对象。分配在静态或者栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在其定义的程序块运行时才存在;static对象在使用之前分配,在程序结束时销毁。
        除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或者堆程序用堆来储存动态分配的的对象,而动态分配对象的生存期是由程序来控制的,换言之就是需要显式地销毁它们,编译器不会自动帮我们销毁。

        C++的动态内存管理是通过一对运算符来完成的new在动态内存中为对象分配空间并返回一个指向该对象的指针,可以同时对该对象进行初始化;delete接受一个动态对象的指针,销毁该对象,并释放与之关联是内存。

        题外话:new/delete与malloc/free之间的区别

        (1)new和delete都是带具体类型的指针,而malloc和free返回的是void类型的指针

        (2)new的底层是通过malloc来开辟内存的,但new比malloc多一项功能,那功能就是开辟完内存还要进行初始化操作。

        (3)malloc是函数,开辟内存需要传入需要字数,如malloc(100);表示在堆上开辟了100个字节的内存,返回void *,表示分配的堆内存的起始地址,因此malloc的返回值需要强转成指定的类型。new是运算符,开辟内存需要指定类型,返回指定的类型,因此不需要强转;

        (4)C++允许重载new/delete操作符,可以自定义内存分配和释放的策略,而malloc和free不可以重载

        malloc/free是C/C++中标准库函数,new/delete是C/C++中的关键字,都是开辟内存和释放内存的。malloc/free只能满足库内的数据类型,无法满足动态开辟对象的要求。对象在创建时调用构造函数,销毁时调用析构函数。malloc/free是库内提供的函数而不是运算符,不在编译器的范围之内,不能够把执行构造函数和析构函数的任务强加于他。C++需要一个能够完成开辟内存和调用构造函数的new,对象销毁时释放内存和调用析构函数的delete。

        想更清楚了解两者之间的区别可以看这篇文章:

        链接:https://blog.csdn.net/rjp_1987/article/details/104539467

 2、智能指针简述:

        动态对象的正确释放是一件极容易出错的事情,有时候可能不经意间释放了两次同一块内存,也会导致程序出错。为了更安全地使用动态对象,标准库定义了两个智能指针类型来管理动态分配对象。当一个对象应该被释放时,指向它的智能指针可以确保自动地释放它
        新标准库提供了两种智能指针,这两者的区别在于管理底层指针的方式:shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象。标准库还定义了一个名为weak_ptr的便随类,它是一种弱引用,指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

czy1219

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值