写点什么

C++ 动态内存分配的问题,你都懂了吗?

作者:小梁编程汇
  • 2022 年 1 月 04 日
  • 本文字数:1569 字

    阅读完需:约 5 分钟

C++ 动态内存分配的问题,你都懂了吗?

为什么需要了解动态内存分配,理由很简单,熟悉内存分配是编程中基本技能,但对于 c++这门语言也是一个让人很头疼的问题。如何正确申请和释放内存成为 c++编程中一个很重要但也很棘手的话题。但是在智能指针(smart pointer)出来之后,很多问题都变得很简单。下面带大家了解和熟悉下如何使用它们。

1. shared_ptr:允许多个指针同时指向同一个对象



(1)补充:1、make_shared<T>(args),中的 args 要符合前面的类型 T 的参传入数格式 2、 shared_ptr<T>(args),其中 args 只能以()的形式来初始化 shared_ptr,因为 shared_ptr 的构造函数是 explict 的,不允许 T* ptr 这种类型隐式转换成 share_ptr,错误样例: shared_ptr<int> clone(int p) { return new int(p); }3、p.get()返回指向智能指针管理对象的内置指针 4、建议使用 shared_ptr(new int() )来初始化 shared_ptr,如果 int* p = new int(); shared_p(p),如果只有一个 shared_ptr 指向该内存,p 所指空间已被释放,可能会出现 double free 和解引用非法内存,但是最好使用 make_shared 代替 shared_ptr(new int() )

(2)管理 shared_ptr 在调用一次拷贝构造函数时(传对象参数,return 对象,显示调用拷贝构造函数),计数器+1,shared_ptr 在一次赋值,=号左边的引用计数器-1,=号右边的引用计数器+1,一次声明周期结束时,计数器会-1 当 shared_ptr 引用计数值=0,会自动释放自己所管理的对象 shared_ptr 保证,只要有任何指针引用对象,对象就不会被释放掉(3)运用动态分配内存的理由不知道要使用多少对象: 例如容器不知道所需对象的准确类型: 例如为实现多态而动态申请父类元素指针多个对象共享数据动态分配内存程序员容易造成内存泄露,所以要用智能指针(4)直接管理内存:int* p = new int; //*p 是一个未定义的值 int* p = new int(); //*p 被初始化为 0int* p = new int(10); //*p 初始化为 10 对象会调用默认构造函数来初始化对象,但是内置变量必须在默认构造函数中初始化,否则值也是未定义的内置指针管理的动态内存在显式释放前都一直存在,需要手动释放(5)常犯的错误:忘记 delete new 申请的动态内存(new[]/delete[]) // 没删解引用已经被释放的对象 // 删了又用同一块内存别释放两次 // 多删编程的好习惯是:delete 之后重置指针=nullptr 可以保证指针不会使用已经 delete 掉的空间注意事项不要混用普通指针和智能指针,比如:int *p = new int(10); void b(shared_ptr<int>(p)){ return; }; *p = 1000; //p 指向对 象已经被释放掉




2. unique_ptr:一个对象只能被一个指针指向

初始化方式:

1、unique_ptr<int>(new int (10))的形式直接初始化,c++14 后可以用 make_unique2、unique_ptr<int>p(q) //error,不存在允许拷贝赋值,所以也没有类似 shared_ptr 类似的函数// 观察编译器如何诊断unique_ptr出现赋值,拷贝这种错误#include<iostream>#include<memory>using namespace std;int main(int argc, char* argv[]){unique_ptr<int>uPtr(new int(20));unique_ptr<int>p1(uPtr); // use of deleted functionunique_ptr<int>p2 = uPtr; // use of deleted function}

u.reset(q),如果 reset 不为空,则会先把 u 指向的内容释放掉,再让 u 管理内存 q

不能拷贝赋值的 unique_ptr 有一个特列:


思考:为什么 shared_ptr 没有 release 函数因为 shared_ptr 是可共享的,而且每个 shared_ptr 的副本都可以 delete 指向的对象,而 unique_ptr 不能共享内存,所以要由对应的 unique_ptr 释放内存

3. weak_ptr:指向 share_ptr 管理的对象


本文截取自 c++圣经:C++ Primer (5th Edition)

更多 c++语言特性优质学习网站有 1.cppreference.com

2.http://www.learncpp.com/

3.The C++ Resources Network

c++优质项目汇总:https://github.com/fffaraz/awesome-cpp

c++视频学习网站:

b 站侯捷的 STLeffective c++


感兴趣的同学可以关注我的微信公号:小梁编程汇,后续更多干货会在 infoQ 和公众号持续更新。


发布于: 3 小时前
用户头像

less-than-more 2018.09.29 加入

微信公众号【小梁编程汇】 热爱技术、坚持分享优质文章。 喜欢我可以关注微信公众,我将在上面持续输出干货。

评论 (1 条评论)

发布
用户头像
感觉不错的,可以关注一波微信公众号【小梁编程汇】,上面干货更多哦
3 小时前
回复
没有更多了
C++ 动态内存分配的问题,你都懂了吗?