C++Primer第五版 习题答案 第十二章 动态内存

这篇博客详细解答了C++ Primer第五版第十二章关于动态内存的习题,涉及智能指针的使用、内存管理、动态数组以及异常安全等内容。博主对每个习题进行了深入的分析,并给出了相应的解决方案和注意事项,帮助读者理解和掌握C++中动态内存的管理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12.1

b1有四个元素;
b2被销毁;

12.2

strBlob.h

#ifndef STRBLOB_H_
#define STRBLOB_H_

#include<string>
#include<memory>
#include<vector>
#include<initializer_list>
#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, 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");
	return data->pop_back();
}

#endif // !STRBLOB_H_

strBlob.cpp

#include"strBlob.h"
#include<iostream>

int main()
{
   

	strBlob b1 = {
    "a","b","c" };
	const strBlob b2 = {
    "a","c","d" };

	std::cout << b1.back() << std::endl;
	std::cout << b2.back() << std::endl;
}

12.3

不需要,添加进去虽然编译器不会报错,但不符合使用者的使用习惯;

12.4

i的size_type大于0的;

12.5

优点:可以清楚知道使用的类型;
缺点:不易使用,需要显式初始化;

12.6

#include<iostream>
#include<vector>
#include<string>

std::vector<int>* create_vi()
{
   
	return new std::vector<int>;
}

void push_vi(std::vector<int>* p)
{
   
	int i;
	while (std::cin >> i)
		p->push_back(i);
}
void print_vi(std::vector<int>* p)
{
   
	for (const auto i : *p)
		std::cout <<i << " ";
	std::cout << std::endl;
}
int main()
{
   
	auto p = create_vi();
	push_vi(p);
	print_vi(p);
	delete p;
	return 0;
}

12.7

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

std::shared_ptr<std::vector<int>> create_vi()
{
   
	return std::make_shared<std::vector<int>>();
}

void push_vi(std::shared_ptr<std::vector<int>> p)
{
   
	int i;
	while (std::cin >> i)
		p->push_back(i);
}
void print_vi(std::shared_ptr<std::vector<int>> p)
{
   
	for (const auto i : *p)
		std::cout <<i << " ";
	std::cout << std::endl;
}
int main()
{
   
	auto p = create_vi();
	push_vi(p);
	print_vi(p);
	//delete p;
	return 0;
}

12.8

指针p被转换为bool值,new的内存没有被delete,内存没有被释放;

12.9

应该先delete r,再r=q;
r2的内存自动释放;

12.10

正确;

12.11

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

12.12

a)合法,将智能指针赋值给process;
b)不合法,接受指针参数的智能指针构造函数时explicit的,需要直接初始化,不能将内置指针隐式转化为智能指针;
c)不合法,接受指针参数的智能指针构造函数时explicit的,需要直接初始化,不能将内置指针隐式转化为智能指针;
d)合法,但p的内存会被释放;

12.13

sp和p指向同一个对象,程序手动删除了p指向对象,程序结束时自动删除sp指向对象,会两次销毁同一对象;

12.14

#include<iostream>
#include<string>
#include<memory>

struct destination
{
   
	std::string des;
	destination(std::string des_) :des(des_) {
   }
};

struct connection
{
   
	std::string conn;
	connection(std::string conn_) :conn(conn_) {
   }
};

connection connect(destination* des_)
{
   

	std::cout << "connect to " << des_->des << std::endl;
	return connection(des_->des);
}
void disconnect(connection conn_)
{
   
	std::cout << "disconnect " << conn_.conn << std::endl;
}
void end_connection(connection* p) {
    disconnect(*p); }

void f(destination& d)
{
   
	connection c = connect(&d);
	std::shared_ptr<connection> p(&c, end_connection);
	std::cout <<"connecting now(" << p.use_count() << " )" << std::endl;
}

int main()
{
   
	destination des("aa");
	f(des);
	return 0;
}

12.15

#include<iostream>
#include<string>
#include<memory>

struct destination
{
   
	std::string des;
	destination(std::string des_) :des(des_) {
   }
};

struct connection
{
   
	std::string conn;
	connection(std::string conn_) :conn(conn_) {
   }
};

connection connect(destination* des_)
{
   

	std::cout << "connect to " << des_->des << std::endl;
	return connection(des_->des);
}
void disconnect(connection conn_)
{
   
	std::cout << "disconnect " << conn_.conn << std::endl;
}
//void end_connection(connection* p) { disconnect(*p); }

void f(destination& d)
{
   
	connection c = connect(&d);
	std::shared_ptr<connection> p(&c, [](connection* p) {
   return disconnect(*p); });
	std::cout <<"connecting now(" << p.use_count() << " )" << std::endl;
}

int main()
{
   
	destination des("aa");
	f(des);
	return 0;
}

12.16

#include<iostream>
#include<string>
#include<memory>

int main(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值