p404:
到目前为止,我们使用过的类中,分配的资源都与对应对象生存期一致。例如,每个
vector“拥有”其自己的元素。当我们拷贝一个 vector 时,原 vector 和副本 vector
中的元素是相互分离的:
vector<string> v1;
{
vector<string> v2 = {"a","an","the"};
v1 = v2;
}
由一个 vector 分配的元素只有当这个 vector 存在时才存在。当一个 vector 被销毁
时,这个 vector 中的元素也都被销毁。
上段字面理解了下以为是说 v1 是引用 v2 的元素,若 v2 内的元素过了块被销毁,v1 的元素也就没了,但是自己代码敲了一遍发现能正常使用:
vector<string> v1;
{
vector<string> v2= {"a","an","the"};
v1 =v2;
}
for(string s: v1){
cout <s << " ";
}
结果:an an the
p414
...也不要用 get 初始化一个智能指针或者为智能指针赋值
智能指针类型定义了一个名为 get 的函数(参见表 12.1),它返回一个内置指针,
指向智能指针管理的对象。此函数是为了这样一种情况而设计的:我们需要向不能使用智
能指针的代码传递一个内置指针。使用 get 返回的指针的代码不能 delete 此指针。
虽然编译器不会给出错误信息,但将另一个智能指针也绑定到 get 返回的指针上是
错误的:
shared ptr<int> p(new int (42) ); //引用计数为 1
int *q = p.get(); 1/正确:但使用 q 时要注意,不要让它管理的指针被释放
( //新程序块
//未定义:两个独立的 shared-ptr 指向相同的内存
shared ptr<int>(q);
//程序块结束, q 被销毁,它指向的内存被释放
int foo = *p; //未定义: p 指向的内存已经被释放了
}
在本例中, p 和 q 指向相同的内存,由于它们是相互独立创建的,因此各自的引用计数都
是 1,当 q 所在的程序块结束时, q 被销毁,这会导致 q 指向的内存被释放。从而 p 变成
一个空悬指针,意味着当我们试图使用 p 时,将发生未定义的行为。而且,当 p 被销毁时,
这块内存会被第二次 delete.
这段自己也敲了代码,也是能正常引用 p:
shared ptrcint> p3(new int(42));
cout <<*p3 < endl;
int *q1 =p3.get();
{
shared ptr<int>(q1);
}
int foo=p33,
cout <<foo < endl;
结果:
42
42
是 C++更新导致书的描述过时了还是我看错了?
到目前为止,我们使用过的类中,分配的资源都与对应对象生存期一致。例如,每个
vector“拥有”其自己的元素。当我们拷贝一个 vector 时,原 vector 和副本 vector
中的元素是相互分离的:
vector<string> v1;
{
vector<string> v2 = {"a","an","the"};
v1 = v2;
}
由一个 vector 分配的元素只有当这个 vector 存在时才存在。当一个 vector 被销毁
时,这个 vector 中的元素也都被销毁。
上段字面理解了下以为是说 v1 是引用 v2 的元素,若 v2 内的元素过了块被销毁,v1 的元素也就没了,但是自己代码敲了一遍发现能正常使用:
vector<string> v1;
{
vector<string> v2= {"a","an","the"};
v1 =v2;
}
for(string s: v1){
cout <s << " ";
}
结果:an an the
p414
...也不要用 get 初始化一个智能指针或者为智能指针赋值
智能指针类型定义了一个名为 get 的函数(参见表 12.1),它返回一个内置指针,
指向智能指针管理的对象。此函数是为了这样一种情况而设计的:我们需要向不能使用智
能指针的代码传递一个内置指针。使用 get 返回的指针的代码不能 delete 此指针。
虽然编译器不会给出错误信息,但将另一个智能指针也绑定到 get 返回的指针上是
错误的:
shared ptr<int> p(new int (42) ); //引用计数为 1
int *q = p.get(); 1/正确:但使用 q 时要注意,不要让它管理的指针被释放
( //新程序块
//未定义:两个独立的 shared-ptr 指向相同的内存
shared ptr<int>(q);
//程序块结束, q 被销毁,它指向的内存被释放
int foo = *p; //未定义: p 指向的内存已经被释放了
}
在本例中, p 和 q 指向相同的内存,由于它们是相互独立创建的,因此各自的引用计数都
是 1,当 q 所在的程序块结束时, q 被销毁,这会导致 q 指向的内存被释放。从而 p 变成
一个空悬指针,意味着当我们试图使用 p 时,将发生未定义的行为。而且,当 p 被销毁时,
这块内存会被第二次 delete.
这段自己也敲了代码,也是能正常引用 p:
shared ptrcint> p3(new int(42));
cout <<*p3 < endl;
int *q1 =p3.get();
{
shared ptr<int>(q1);
}
int foo=p33,
cout <<foo < endl;
结果:
42
42
是 C++更新导致书的描述过时了还是我看错了?