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(