- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C中的动态内存与智能指针
C++中的动态内存与智能指针
在C++中,我们通过new(在动态内存中为对象分配空间并初始化对象)和delete(销毁该对象,并释放内存)直接分配和释放动态内存。
如下代码:
1 int *pi = new int;//pi 指向一个未初始化的int 有些人有这样的疑问,指针一定要new吗?其实指针和new没有什么关系。这里的new在动态内存里为对象分配了内存空间,并返回了一个指向该对象的指针。new是申请堆空间,不new是在栈上分配内存,指针只要指向有效的内存空间就可以。比如:
1
2
3 int i;
int *p = i;
p-i;//p可以直接使用了 new直接初始化对象:
1
2 int *pi = new int(128);//pi指向值为128的对象
string ps = new string(christian);//*ps 指向“christian”的字符串 new分配const对象必须进行初始化,并且返回的执着是一个指向const对象的指针:
1 const int p = new const int(1024);//分配并初始化一个const int; 当然new申请内存分配的时候也不是都会成功的,一旦一个程序用光了他的所有可用内存(虽然这种情况一般很少发生),new表达式就会失败。这时候会抛出bad_alloc异常。所以我们需要通过delete来释放占用的内存。在这里注意delete并不是要删除指针,而是释放指针所指的内存。
1
2
3
4
5
6
7 int i;
int *pi = i;
string str = dwarves;
double *pd = new double(33);
delete str; // 错误:str不是一个指针
delete pi;? // 错误:pi指向一个局部变量
delete pd;? // 正确 使用new和delete来管理动态内存常出的一些错误:
1.忘记delete,即导致了“内存泄漏”,
2.野指针。在对象已经被释放掉之后,指针会置为空。这时候我们再次使用,会产生使用非法内存的指针。
不过如果我们需要保留指针,可以在delete以后将nullptr赋予指针,这样指针就不指向任何对象了,如下代码:
1
2
3
4 auto p(new auto 42);
auto q = p;
delete p;
p = nullptr; ?
题外话:在测试这个问题的时候,我输出了下q的值发现还是42,并且没有报错,后来在delete p之后,我又给*p = 19;这个时候 p ,q的值在输出的时候都是19,也没有报错。这个代码其实根本就是错误的了,因为p,q已经没有有效的内存空间了。这里是释放了内存,但指针的值不变,指向的内存不会清0,指向的这片内存区域是待分配的,如果没有被其他数据覆盖的话,你就能幸运得输出这主要原因是你分配的内存小,没有继续分配,被占用的概率小所致。我用的xcode,换到VS下就正常报错了,是因为VS为了从编译器的角度上解决缓冲区溢出等问题,加上的这种功能,C++标准里面没有这么要求,所有xcode和gcc是不会检查的。所以在这里 建议大家写纯C++代码的时候用vs。
3.重复delete,就会使自由空间遭到破坏如:
1
2
3 string ps1 = new string (one),ps2 = ps1;
delete ps1;
delete ps2;//ps2的内存已经被释放了 虽然显示的管理内存在性能上有一定的优势,但是随着多线程程序的出现和广泛使用,内存管理不佳的的情况变得更严重。所以C++标准库中的智能指针很好的解决了这些问题。
auto_ptr以对象的方式管理堆分配的内存,并在适当的时间(比如析构),释放内存。我们只需要将new操作返回的指针作为auto_ptr的初始值,而不需要调用delete:
1 auto_ptr (new int); 但是auto_ptr在拷贝时会返回一个左值并且不能调用delete[];所以在C++11中改用shared_ptr(允许多个指针指向一个对象),unique_ptr(“独占”所指向的对象)还有weak_ptr它是一种不控制所指对象生存期的智能指针,指向shared_ptr所管理的对像,在memory头文件中。
当我们定义一个unique_ptr的时候,需要将其绑定到一个new返回的指针。
只能有一个uniqu_ptr指向对象,也就是说它不能被拷贝,也不支持赋值。但是我们可以通过move来移动
1
2
3
4
5
6 std::unique_ptrint p1(new int(5));
std::unique_ptrint p2 = p1; // 编译会出错
std::unique
您可能关注的文档
最近下载
- 22G101 三维彩色立体图集.docx VIP
- 2025年部编版四年级下册道德与法治全册教案教学设计[WORD最新带板书带目录.pdf VIP
- 8D报告案例模板.ppt VIP
- 工程结算审核实务:重点难点解析及解决方案.docx VIP
- 重大活动应急预案.docx VIP
- DB34T4021-2021《城市生命线工程安全运行监测技术标准》.docx VIP
- 宁波市2023年小学生科普知识学习体验活动-高段组(参考答案) .pdf VIP
- 拼装式施工灯架制作和安装工艺.pdf VIP
- 青岛宏丰聚三氟氯乙烯及氟碳乳液合成工艺问世.pdf VIP
- 江苏省南通市2024-2025学年八年级下学期期末物理试题.pdf VIP
文档评论(0)