小言_互联网的博客

C++ Primer 课后习题详解 | 12.1.2 直接管理内存

371人阅读  评论(0)

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: C/C++面试通关【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、练习 12.6

1.1 题目描述

1.2 题目解析

二、练习 12.7

2.1 题目描述

2.2 题目解析

三、练习 12.8

3.1 题目描述

3.2 解题思路

四、练习 12.9

4.1 题目描述

4.2 题目解析


本篇文章是对 C++ Primer 第五版 第 12.1.12 节课后习题 12.6 ~ 12.9 的讲解。

一、练习 12.6

1.1 题目描述

编写函数,返回一个动态分配的 int 的 vector。将此 vector 传递给另外一个函数,这个函数读取标准输入,将读入的值保存在 vector 元素中。再将 vector 传递给另外一个函数,打印读入的值。记得在恰当的时刻 delete vector。

1.2 题目解析

代码实现如下所示。


  
  1. #include <iostream>
  2. #include <vector>
  3. std::vector<int> *vectorMalloc()
  4. {
  5. return new std::vector< int>;
  6. }
  7. void readValue(std::vector<int>* p)
  8. {
  9. int val;
  10. std::cin>>val;
  11. p-> push_back(val);
  12. }
  13. void printValue(std::vector<int>* p)
  14. {
  15. for ( const auto i : *p) {
  16. std::cout<<i<<std::endl;
  17. }
  18. }
  19. int main()
  20. {
  21. auto p = vectorMalloc();
  22. readValue(p);
  23. printValue(p);
  24. delete p;
  25. return 0;
  26. }

二、练习 12.7

2.1 题目描述

重做上一题,这次使用 shared_ptr 而不是内置指针。

2.2 题目解析

代码实现如下所示。


  
  1. #include <iostream>
  2. #include <vector>
  3. #include <memory>
  4. typedef std::shared_ptr<std::vector< int>> sharePtrVector;
  5. sharePtrVector vectorMalloc()
  6. {
  7. return std::make_shared<std::vector< int>>();
  8. }
  9. void readValue(sharePtrVector p)
  10. {
  11. int val;
  12. std::cin>>val;
  13. p-> push_back(val);
  14. }
  15. void printValue(sharePtrVector p)
  16. {
  17. for ( const auto i : *p) {
  18. std::cout<<i<<std::endl;
  19. }
  20. }
  21. int main()
  22. {
  23. auto p = vectorMalloc();
  24. readValue(p);
  25. printValue(p);
  26. return 0;
  27. }

三、练习 12.8

3.1 题目描述

下面的函数是否有错误?如果有,解释错误原因。


  
  1. bool b()
  2. {
  3. int* p = new int;
  4. // ...
  5. return p;
  6. }

3.2 解题思路

函数返回类型错误,应该是 int*,上述代码中,p 将转换为 bool 类型这样写编译器一般检查不出来错误,会导致内存泄漏问题。

四、练习 12.9

4.1 题目描述

解释下面代码执行的结果:


  
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int *q = new int( 42), *r = new int( 100);
  6. r = q;
  7. auto q2 = make_shared< int>( 42), r2 = make_shared< int>( 100);
  8. r2 = q2;
  9. return 0;
  10. }

4.2 题目解析

首先,执行 r = q 后,并没有指针指向原 r 指向的内存,造成内存泄漏。

执行 r2 = q2 后,r2 原指内存空间引用计数减一变为 0,所在内存空间被释放,q2 所指内存引用计数加一。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞



转载:https://blog.csdn.net/u011074149/article/details/128429437
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场