返回信息流一个小程序,三个文件如下:
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()方法??
这是一条镜像帖。来源:北邮人论坛 / cpp / #73771同步于 2013/9/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于delete的一个疑问
liusdut
2013/9/20镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
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了啊?
temp->say();
这行会被编译器改写为函数名类似_say(temp)这样的函数,即把对象地址放入函数参数列表作为第一个参数,因为函数体里没用到this指针,所以即使temp=null也不会影响函数执行,所以会出现lz说的情况。
lz可以在这个函数里随便调用一下this,比如cout << top << endl;试试结果。
跟楼上想法一样
维基百科上说,调用类的成员方法“这通常被通过将对象的地址作为隐含的第一个参数传入实现。”
我猜想入口地址没变。我试了几种办法想获得成员函数的入口地址,但是都失败了。。。过后再想想别的办法。
我尝试在say函数中引用变量,比如a=NULL; 结果是Segmentation fault (core dumped),想来也应当是这样的。
搜了一下,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
函数不像动态数据一样~只要有入口点~根本就不要实例也能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