习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html

第12章 动态内存


练习12.1

b1包含4个元素,b2被销毁

练习12.2

#include <string>
#include <initializer_list>
#include <memory>
#include <vector>
#include <stdexcept> class StrBlob
{
public:
typedef std::vector<std::string>::size_type size_type;
StrBlob();
StrBlob(std::initializer_list<std::string> il);
size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
void push_back(const std::string &t) { data->push_back(t); }
void pop_back();
std::string& front();
std::string& back();
const std::string& front() const;
const std::string& back() const;
private:
std::shared_ptr<std::vector<std::string>> data;
void check(size_type i, const std::string &msg) const;
}; StrBlob::StrBlob() : data(std::make_shared<std::vector<std::string>>()) {}
StrBlob::StrBlob(std::initializer_list<std::string> il) : data(std::make_shared<std::vector<std::string>>(il)) {} void StrBlob::check(size_type i, const std::string &msg) const
{
if (i >= data->size())
throw std::out_of_range(msg);
} std::string& StrBlob::front()
{
check(0, "front on empty StrBlob");
return data->front();
} std::string& StrBlob::back()
{
check(0, "back on empty StrBlob");
return data->back();
} const std::string& StrBlob::front() const
{
check(0, "front on empty StrBlob");
return data->front();
} const std::string& StrBlob::back() const
{
check(0, "back on empty StrBlob");
return data->back();
} void StrBlob::pop_back()
{
check(0, "pop_back on empty StrBlob");
data->pop_back();
}

练习12.6

#include<vector>
#include<iostream>
#include<string> using namespace std; vector<int> *create_vi() {
return new std::vector<int>;
} void push_vi(vector<int> *p) {
int i;
while (cin >> i) {
p->push_back(i);
}
} void print_vi(vector<int> *p) {
for (const auto i : (*p)) {
cout << i << " ";
}
cout << endl;
} int main() {
auto p = create_vi();
push_vi(p);
print_vi(p);
delete(p);
system("pause");
return 0;
}

练习12.7

#include<vector>
#include<iostream>
#include<string>
#include<memory> using namespace std; shared_ptr<vector<int>> create_vi() {
return make_shared<vector<int>>();
} void push_vi(shared_ptr<vector<int>> p) {
int i;
while (cin >> i) {
p->push_back(i);
}
} void print_vi(shared_ptr<vector<int>> p) {
for (const auto i : (*p)) {
cout << i << " ";
}
cout << endl;
} int main() {
auto p = create_vi();
push_vi(p);
print_vi(p);
system("pause");
return 0;
}

练习12.8

有,p的类型被强制转换为bool值,并且new的内存没有delete。

练习12.9

r=q后r所指的内存没有释放,再使用p指针会出错。

练习12.10

正确

练习12.11

离开process时,p指向的内存会被释放,再使用p指针会出现错误。

练习12.12

a.合法,将智能指针赋值给process

b.不合法,shared_ptr初始化内置指针时需要使用直接初始化的形式。

c.不合法,shared_ptr初始化内置指针时需要使用直接初始化的形式。

d.合法。

练习12.13

sp和p指向同一个内存,释放了p所指的内存后,再使用sp调用对象可能会出错。

练习12.14

#include<iostream>
#include<memory>
#include<string> using namespace std; struct destination {
string des;
destination(string des_) :des(des_) {}
}; struct connection{
string conn;
connection(string conn_) :conn(conn_) {}
}; connection connect(destination *des_) {
cout << "connect to: " << des_->des << endl;
return connection(des_->des);
} void disconnect(connection conn_) {
cout << "disconnect " << conn_.conn << endl;
} void end_connection(connection *p) { disconnect(*p); } void f(destination &d) {
connection c = connect(&d);
shared_ptr<connection> p(&c, end_connection); //p接管了内置指针&c所指向的对象的所有权
cout << "connecting now(" << p.use_count() << ")" << endl;
} int main() {
destination des("aa");
f(des); system("pause");
return 0;
}

练习12.15

#include<iostream>
#include<memory>
#include<string> using namespace std; struct destination {
string des;
destination(string des_) :des(des_) {}
}; struct connection{
string conn;
connection(string conn_) :conn(conn_) {}
}; connection connect(destination *des_) {
cout << "connect to: " << des_->des << endl;
return connection(des_->des);
} void disconnect(connection conn_) {
cout << "disconnect " << conn_.conn << endl;
} void end_connection(connection *p) { disconnect(*p); } void f(destination &d) {
connection c = connect(&d);
shared_ptr<connection> p(&c, [](connection *p) {disconnect(*p);}); //p接管了内置指针&c所指向的对象的所有权
cout << "connecting now(" << p.use_count() << ")" << endl;
} int main() {
destination des("aa");
f(des); system("pause");
return 0;
}

练习12.16

#include<iostream>
#include<memory>
using namespace std; int main() {
unique_ptr<string> p1(new string("Stegosaurus"));
//unique_ptr<string> p2 = p1;
//unique_ptr<string> p3(p1);
system("pause");
return 0;
}

尝试引用已删除的函数

练习12.17

(a)不合法,ix不是new返回的指针

(b)不合法,pi不是new返回的指针

(c)合法

(d)不合法,&ix不是new返回的指针

(e)合法

(f)不合法,必须使用new返回的指针进行初始化,赋值和拷贝的操作也不包含get()方法

练习12.18

release()函数的作用就是放弃对指针指向对象的控制权,但shared_ptr是多对一的关系,其他的智能指针仍然可以删除这个对象,所以这个函数的话对shared_ptr 没意义

练习12.19

class StrBlob
{
public:
friend class StrBlobPtr;//声明friend
StrBlobPtr begin();
StrBlobPtr end();
StrBlob();//默认构造函数
StrBlob(initializer_list<string> il):data(make_shared<vector<string>>(il)){}
StrBlob(string il):data(make_shared<vector<string>> (il)){}
typedef vector<string>::size_type size_type;//定义类型别名,方便使用 //定义函数,返回大小
size_type size() const
{
return data->size();
}
//判断vector<string>是否为空
bool empty()
{
return data->empty();
}
//向vector<string>中加入元素
void pushback(const string &s)
{
data->push_back(s);
}
//访问函数,应首先调用check()
string& front()
{
check(0,"front on empty StrBlob");
return data->front();
}
string& back()
{
check(0,"back on empty StrBlob");
return data->back();
}
void popback()
{
check(0,"pop_back on empty StrBlob");
data->pop_back();
} private:
shared_ptr<vector<string>> data;//指向vector<string>的智能指针
void check(size_type i,const string &msg) const//若访问元素的大小大于data的size,输出错误信息
{
if (i > data->size())
{
throw out_of_range(msg);//抛出该out_of_range异常,表示不在范围之内
}
}
}; class StrBlobPtr
{
public:
StrBlobPtr():curr(0){}//构造函数,将curr设定为0
StrBlobPtr(StrBlob &a, size_t sz = 0):wptr(a.data),curr(sz){}//构造函数,将StrBlob的智能指针与此类中的weak_ptr绑定
string& deref() const
{
auto p =check(curr,"deference past end");
return (*p)[curr];
}
StrBlobPtr& incr()
{
auto p =check(curr,"deference past end");
++curr;
return *this;
}
private:
shared_ptr<vector<string>> check(size_t i,const string& msg) const//检查函数,返回一个vector<string>的智能指针
{
auto ret = wptr.lock();//检查对象是否还存在
if(!ret)
{
throw runtime_error("未绑定");
}
if (i >= ret->size())
{
throw out_of_range(msg);
}
return ret;
}
weak_ptr<vector<string>> wptr;//定义弱智能指针
size_t curr;//设立游标,表示下标 }; StrBlobPtr StrBlob::begin()
{
return StrBlobPtr(*this);
}
StrBlobPtr StrBlob::end()
{
return StrBlobPtr(*this, data->size());
}

练习12.23

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std; int main() {
const char a[] = "aaa";
const char b[] = "bbb";
char *ans = new char[strlen(a) + strlen(b) + 1];
strcpy(ans, a);
strcat(ans, b);
cout << string(ans) << endl;
delete[] ans;
system("pause");
return 0;
}
#include<iostream>
#include<string> using namespace std; int main() {
const string a = "aaa";
const string b = "bbb";
cout << a + b << endl;
system("pause");
return 0;
}

练习12.24

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string> using namespace std; int main() {
string s;
cin >> s;
char *t = new char[s.size() + 1];
strcpy(t, s.c_str());
cout << t << endl;
delete[] t;
system("pause");
return 0;
}

练习12.25

delete[] pa;

练习12.26

#include<iostream>
#include<memory>
#include<string> using namespace std;
int main() {
allocator<string> alloc;
auto const p = alloc.allocate(10);
string s;
auto q = p;
while (cin >> s && q != p + 10) {
alloc.construct(q++, s);
}
while (q!=p)
{
alloc.destroy(--q);
}
alloc.deallocate(p, 100); system("pause");
return 0;
}

C++Primer第五版——习题答案详解(十一)的更多相关文章

  1. C++Primer第五版——习题答案详解(一)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第1章 开始&&第2章 变量和基本类型 练习1.3 #include&l ...

  2. C++Primer第五版——习题答案详解(二)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第3章 字符串.向量和数组 练习3.2 一次读入一整行 #include<iost ...

  3. C++Primer第五版——习题答案详解(三)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第4章 表达式 练习4.10 while(cin>>i&&i ...

  4. C++Primer第五版——习题答案详解(四)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第5章 语句 练习5.9 #include<iostream> #inclu ...

  5. C++Primer第五版——习题答案详解(五)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第6章 函数 练习6.4 #include<iostream> using ...

  6. C++Primer第五版——习题答案详解(六)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第7章 类 练习7.1 class Sales_data { public: std:: ...

  7. C++Primer第五版——习题答案详解(七)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第8章 IO库 练习8.1 istream &iofunc(istream &a ...

  8. C++Primer第五版——习题答案详解(八)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第9章 顺序容器 练习9.1 a.list,需要按字典序插入,可能插入位置在中间 b.d ...

  9. C++Primer第五版——习题答案详解(九)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第10章 泛型算法 练习10.1 #include<iostream> #i ...

  10. C++Primer第五版——习题答案详解(十)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第11章 关联容器 练习11.3 #include<iostream> #i ...

随机推荐

  1. 云服务器上mysql的配置

    mysql的配置 要想云服务器的mysql数据库能被外部连接,还需要做一些配置 首先执行下面三条命令: sudo apt-get install mysql-server sudo apt isnta ...

  2. 注册一个gitHub

    GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 2008 年 4 月 10 日正式上线,除了 Git 代 ...

  3. 跨域iframe如何通信

    1. 使用document.domain设置相同主域(同主域不同子域): 2. 使用window.name添加空网页: 3. 使用postmessage监听:

  4. HTTP rfc是什么及其工作过程

    概念: HTTP协议描述的是发送方与接收方的通信协议,通过两方的自觉遵守而存在,HTTP是运行于应用层的协议,基于TCP协议而运作.基本上是客户/服务器对答模式,其中也包括在传输过程中的代理,网关,通 ...

  5. HTML5⑥

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. sql多表查询(单表查询略过)

    表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...

  7. python面向对象封装案例(附:is和==的区别)

    面向对象封装案例 目标 封装 小明爱跑步 存放家具 01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对 ...

  8. angular2升级到angular4历程

    Angular 4 在昨天(2017-03-24)正式发布了,我的系列教程也得更新一下.步骤略繁琐,不用 cli 的项目反倒更简单一些,但是 cli 平时给我们的便利还是很多的,升级最多半年一次而已. ...

  9. 最短路,floyd算法,图的最短路径

    题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线 ...

  10. 团队项目(MVP------新能源汽车无线充电管理网站)(个人任务1)

    个人任务:1.设计问卷调查了解电动车目前的市场需求情况 2.收集问卷,并且进行总结和分析 3.后台管理系统界面的登录和注册界面的编写(主要用到html,css,javascript,其中用户的合法性检 ...