BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #73771同步于 2013/9/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于delete的一个疑问

liusdut
2013/9/20镜像同步8 回复
一个小程序,三个文件如下: main.cpp #include <iostream> #include "Temp.h" using namespace std; int main(){ Temp *temp = new Temp; delete temp; temp = NULL; temp->say(); return 0; } Temp.h #include <iostream> using namespace std; class Temp{ private: int *a; int length; int top; public: Temp(){ cout<<"This is in Temp"<<endl; } void say(); ~Temp(){ cout<<"Left Temp"<<endl; } }; Temp.cpp #include "Temp.h" void Temp::say(){ printf("Hello world\n"); } 运行结果是: This is a Temp Left Temp Hello World 为什么我在delete之后还可以调用temp的say()方法??
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
gsl2011机器人#1 · 2013/9/20
因为它还是Temp类型的指针 还是能找到函数的地址。
noyle机器人#2 · 2013/9/20
可是temp已经被赋NULL了啊? 【 在 gsl2011 的大作中提到: 】 : 因为它还是Temp类型的指针 还是能找到函数的地址。
iFadeToBlack机器人#3 · 2013/9/20
try //Temp.h class Temp { private: const char* message; }; // Temp.cpp const char* Temp::message = "hello world!" void Temp::say() { cout << message << endl; } 【 在 noyle 的大作中提到: 】 : 可是temp已经被赋NULL了啊?
gaoweiwei机器人#4 · 2013/9/20
temp->say(); 这行会被编译器改写为函数名类似_say(temp)这样的函数,即把对象地址放入函数参数列表作为第一个参数,因为函数体里没用到this指针,所以即使temp=null也不会影响函数执行,所以会出现lz说的情况。 lz可以在这个函数里随便调用一下this,比如cout << top << endl;试试结果。
kazetake机器人#5 · 2013/9/21
跟楼上想法一样 维基百科上说,调用类的成员方法“这通常被通过将对象的地址作为隐含的第一个参数传入实现。” 我猜想入口地址没变。我试了几种办法想获得成员函数的入口地址,但是都失败了。。。过后再想想别的办法。 我尝试在say函数中引用变量,比如a=NULL; 结果是Segmentation fault (core dumped),想来也应当是这样的。
noyle机器人#6 · 2013/9/22
搜了一下,stackoverflow上有类似的问题,回答原因是undefined behavior: http://stackoverflow.com/questions/18686519/c-accessing-member-function-after-calling-delete-to-an-object http://stackoverflow.com/questions/18478262/c-why-i-can-access-member-functions-even-after-the-object-was-deleted
tonyjansan机器人#7 · 2013/9/23
函数不像动态数据一样~只要有入口点~根本就不要实例也能call到~ Temp* t = NULL; t->func(); 同样可以!只要你在func中没有用到Temp的非静态成员变量! 当然,按照C++的设计理念,和类内数据成员完全无关函数推荐加标static,调用时直接Temp::func(),这样就不会走入误区了~ 【 在 liusdut 的大作中提到: 】 : 一个小程序,三个文件如下: : main.cpp : #include <iostream> : ................... ----------------------------------------------------------------- 数据和函数完全是两码事~C++害死一批人啊~ 【 在 noyle 的大作中提到: 】 : 搜了一下,stackoverflow上有类似的问题,回答原因是undefined behavior: : http://stackoverflow.com/questions/18686519/c-accessing-member-function-after-calling-delete-to-an-object : http://stackoverflow.com/questions/18478262/c-why-i-can-access-member-functions-even-after-the-object-was-deleted
huageby机器人#8 · 2013/9/23
应该是未定义的行为,实际是不能这样写的