作者zlw (洞房不败)
看板C_and_CPP
标题Re: [问题] C++ FQA 文章中,有关 dangling refere …
时间Tue Feb 24 13:23:44 2009
感谢 Fenikso、tinlans 两位前辈的解答,让我对这个问题有比较具体的了解
在此篇做个整理。
01 #include <iostream>
02
03 int &fun1(){
04 int x1 = 1;
05 printf("x1 = %d, &x1 = %x\n", x1, &x1);
06 return x1;
07 }
08
09 void fun2(){
10 int x2 = 2;
11 printf("x2 = %d, &x2 = %x\n", x2, &x2);
12 }
13
14 int main(void){
15
16 int &y = fun1();
17
18 printf("y = %d, &y = %x\n", y, &y);
19
20 fun2();
21
22 printf("y = %d, &y = %x\n", y, &y);
23
24 return 0;
25 }
-------------------------------------------------
编译器为 Visual Studio 2008,输出结果如下:
x1 = 1, &x1 = 12fe80
y = 1, &y = 12fe80
x2 = 2, &x2 = 12fe80
y = 2, &y = 12fe80
--------------------------------------------------
因为 x1 在 fun1() 呼叫结束後确实消灭,所以 fun2() 里的 x2 才会用了同样的位址。
如果 y 这个 reference 仅仅只是 x1 的别名,则在第18行 x1 已经消灭时,
y 应该同样无法存取才对。更不应该在执行毫不相干的 fun2() 後,内容值被更改。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 124.8.147.102
1F:推 tinlans:常见的问题是,delete 完後再 new 得到的位址常常和刚刚 02/24 13:42
2F:→ tinlans:释放出去的是同一个,结果造成那个新的空间在非预期的状况 02/24 13:42
3F:→ tinlans:下被修改到。 02/24 13:42
不知道实务上,有经验的设计者是怎麽处理这个问题?
我想到的是要做new的时候,建立一个新的物件对应这块记忆体空间,比如 obj1
然後 obj1 里面有一个STL的vector构成的动态阵列,存放所有指向这块空间的指标
要做 delete 的时候,就把整个 obj1 里的指标删掉。
总之目的就是让指向同样记忆体空间的指标之间有关联性存在
不过没实际测试,不知道这个方法会不会太天真
※ 编辑: zlw 来自: 124.8.147.102 (02/24 14:07)
4F:推 tinlans:这样做不划算,出问题的时候用 memory debug tool or lib 02/24 14:14
5F:→ tinlans:来抓就行;平常写 code 都用 smart pointer 其实很少出事 02/24 14:14
6F:→ tinlans:,Linux 下的话,valgrind 这个工具可以帮你抓。 02/24 14:15
7F:→ zlw:感谢您的经验分享,我会再去了解这些东西,谢谢 02/24 14:18