指標位址是無效內容
回收記憶體後的指標
回收指標記憶體位址中的內容,但指標仍指在原本的位址上。
1
2
3
4
5
6
7
int main() {
int* p = new int(10);
cout << "記憶體回收前的位址 = " << p << endl;
delete p;
cout << "記憶體回收後的位址 = " << p << endl;
return 0;
}
執行結果
記憶體回收前的位址 = 0x600000004060
記憶體回收後的位址 = 0x600000004060
如果對已經被回收(清空)的位址進行讀取,讀取的內容不知道是什麼。
1
2
3
4
5
6
7
8
9
int main() {
int* p = new int(10);
cout << "記憶體回收前的位址 = " << p << endl;
cout << "記憶體回收前的位址讀取位址內容 = " << *p << endl;
delete p;
cout << "記憶體回收後的位址 = " << p << endl;
cout << "讀取位址內容 = " << *p << endl;
return 0;
}
第7行,讀取已回收記憶體的位址中的內容。
執行結果
記憶體回收前的位址 = 0x60000000c010
記憶體回收前的位址讀取位址內容 = 10
記憶體回收後的位址 = 0x60000000c010
讀取位址內容 = -559038448
為避免上面的情況,回收完記憶體,要把記憶體位址設為nullptr
1
2
3
4
5
6
7
8
9
int main() {
int* p = new int(10);
cout << "記憶體回收前的位址 = " << p << endl;
cout << "記憶體回收前的位址讀取位址內容 = " << *p << endl;
delete p;
p = nullptr;
cout << "記憶體回收後的位址 = " << p << endl;
return 0;
}
執行結果
記憶體回收前的位址 = 0x60000000c010
記憶體回收前的位址讀取位址內容 = 10
記憶體回收後的位址 = 0x0
未初始化的指標
1
2
3
4
5
int main() {
int* p;
cout << p << endl;
return 0;
}
第2行,宣告未初始化的指標。
第3行,印出位址,印出不知道何處的位址。
執行結果
0x1e
建議把宣告指標要設初始值。
1
2
3
4
5
int main() {
int* p = nullptr;
cout << p << endl;
return 0;
}
第2行,宣告指標,初始化nullptr。
第3行,印出位址,印出0。
執行結果
0x0
函式返回區域變數位址
1
2
3
4
5
6
7
8
9
10
int* func() {
int i = 10;
cout << "i = " << i << ", &i = " << &i << endl;
return &i;
}
int main() {
int* p = func();
cout << "*p = " << *p << ", p = " << p << endl;
return 0;
}
第1行,宣告函式,返回指標。
第3行,印出區域變數i的值與位址。
第4行,返回變數i的位址。
第7行,宣告指標p,取得函式返回的位址。
第8行,印出函式返回的位址中的值,與位址。
執行結果
i = 10, &i = 0x7ff7bfeff44c
*p = 32760, p = 0x7ff7bfeff44c
由以上執行結果可以發現區域變數i的位址與返回的位址不同,而且值也不一樣。