一個小程式,三個檔案如下:
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()方法??
uj5u.com熱心網友回復:
因為這個temp的記憶體區還沒被其他人覆寫。delete它只是告訴作業系統,我申請的這塊記憶體區我不用了,這記憶體區內的東西依舊存在,直到下個人用到它并寫入其他東東。
跟磁盤一個道理,你洗掉一個檔案,實際只是告訴作業系統,這段磁盤扇區的內容我不要了,這檔案會一直存在直到這段扇區被其他人寫入資料。這也是已洗掉檔案能恢復的原因和條件。
uj5u.com熱心網友回復:
temp不是已經等于NULL?為什么還能訪問得到?
uj5u.com熱心網友回復:
temp不是已經等于NULL?為什么還能訪問得到?
Temp::say()沒有使用任何temp的成員變數,相當于一個靜態函式。
呼叫 ((Temp*)NULL)->say(), 相當于呼叫靜態函式 Temp::say() .
所以沒有出錯。
如果Temp::say() 中有使用 Temp 的成員變數,一呼叫就會AV錯誤。
uj5u.com熱心網友回復:
我的意思是指標置為NULL都還能訪問到原來指向的地址的話,那還有能放心使用的NULL指標么?
說起來,指標置為NULL究竟是什么意思?
uj5u.com熱心網友回復:
