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

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 课后习题详解 | 12.1.2 直接管理内存相关的知识,希望对你有一定的参考价值。

🎈 作者: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 题目解析

代码实现如下所示。

#include <iostream>
#include <vector>

std::vector<int> *vectorMalloc()

    return new std::vector<int>;


void readValue(std::vector<int>* p)

    int val;
    std::cin>>val;
    p->push_back(val);


void printValue(std::vector<int>* p)

    for (const auto i : *p) 
        std::cout<<i<<std::endl;
    


int main()

    auto p = vectorMalloc();
    readValue(p);
    printValue(p);
    delete p;
    return 0;

二、练习 12.7

2.1 题目描述

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

2.2 题目解析

代码实现如下所示。

#include <iostream>
#include <vector>
#include <memory>

typedef std::shared_ptr<std::vector<int>> sharePtrVector;

sharePtrVector vectorMalloc()

    return std::make_shared<std::vector<int>>();


void readValue(sharePtrVector p)

    int val;
    std::cin>>val;
    p->push_back(val);


void printValue(sharePtrVector p)

    for (const auto i : *p) 
        std::cout<<i<<std::endl;
    


int main()

    auto p = vectorMalloc();
    readValue(p);
    printValue(p);
    return 0;

三、练习 12.8

3.1 题目描述

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

bool b()

    int* p = new int;
    // ...
    return p;

3.2 解题思路

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

四、练习 12.9

4.1 题目描述

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

#include <iostream>

using namespace std;

int main()

    int *q = new int(42), *r = new int(100);
    r = q;
    auto q2 = make_shared<int>(42), r2 = make_shared<int>(100);
    r2 = q2;
    return 0;

4.2 题目解析

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

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


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


以上是关于C++ Primer 课后习题详解 | 12.1.2 直接管理内存的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 课后习题详解 | 2.1.2 类型转换

C++ Primer 课后习题详解 | 2.1.1 算术类型

C++Primer第五版——习题答案详解

C++PRIMER第五版练习题答案第一章

C++ Primer(第五版) 整理和总结

C++ Primer 第五版 部分课后题答案