1
secondwtq 2021-12-23 20:33:04 +08:00
第一个,v1 = v2 时会把 v2 里的元素拷贝一份给 v1 ,所以你 v1 是可以用的
第二个,有两种可能,一是虽然 UB 了,但是并没出明显的错误。二是你遇到了 C 坑爹语法里的一个坑,你定义了一个名为 q1 ,类型为 shared_ptr<int>的变量,而非用 q1 初始化了一个匿名的 shared_ptr<int>值。由于你这个奇葩排版实在是难以判断,我怀疑你要是把整段程序都写出来没准还能看到什么 studio.h ,void 面函数之类的 |
2
secondwtq 2021-12-23 20:34:30 +08:00
另外生命周期的问题最好是搞一个有各种 ctor 和 dtor 的类,这样看着清楚一点。
|
3
wevsty 2021-12-23 20:34:32 +08:00
1 、我认为书中的表达是没有说错的,是你理解出现了偏差。
原书中的意思是只有 vector 还在生存周期的时候这些元素才能正常访问,如果 vector 销毁,则其中的元素应该被认为已经被销毁了。 2 、书中的描述很明确。如果你使用 get()拿到了原始指针,并且拿原始指针初始化了另一个智能指针,在第二个智能指针退出生命周期的时候内存已经被 delete 过一次了。使用已经被 delete 过的内存是一种未定义的行为,也许编译器在处理上并没有重新使用这段内存空间,所以你仍然能访问得到原始的结果,但是这只是一种巧合(偶然),并非一定会发生的事件。 最后友情提示:发帖请注意排版 |
4
mmm159357456 2021-12-23 21:02:33 +08:00
第一个用等号是拷贝赋值,用括号同理
|
5
tracker647 OP @secondwtq 图省事直接用 OCR 扫了书上代码处理了下。。。。想想应该直接 md 弄好代码的
|
6
halfdb 2021-12-23 22:05:30 +08:00 via Android
第二个:
从 C++标准的角度说,解引用已经释放的指针是未定义行为,也就是上面说的 UB 。这意味着 C++标准不规定这个行为会引发什么。所以你这一次虽然访问到了原来的数据,但是 C++不保证你每次都会得到这样的结果。 从实现的角度来说,一个指针指向的空间被释放,并不代表那里的数据就没有了。编译器可没空帮你清空数据。在那个空间被下个使用者覆盖掉之前,如果你拿着原来的指针去访问,仍然可以获得原来的数据。 |
7
wevsty 2021-12-23 22:10:21 +08:00 2
不要混用普通指针和智能指针 p413
这个只是一个建议,并不是一个不可打破的规则。混用本身没有问题,只是你得知道自己在做什么。 shared_ptr 是内部帮你维护了一个引用计数, 通过引用计数来确保内存不再被引用的时候就释放。而在使用过程中如果使用 get() 或者直接使用原始指针并不改变引用计数,这是需要自己注意的。 |
8
yianing 2021-12-24 01:02:43 +08:00 via Android
内存被释放了不代表里面内容会被立即清除,继续访问属于未定义行为
|
9
aneostart173 2021-12-24 09:46:42 +08:00
你试试看*p3 = 0 会不会出错咯,或者 delete p3 会不会报 double free error.
|