程式
include
void f1( int *& j)
void any_function_use_local_variables()
int main()
{int i=10;
int *j=&i;
f1(j);
cout<<*j<┃ j ┃
┣━━━━━┫ ┗━━┛
┃ 中斷入口 ┃
┣━━━━━┫
┃ ┃由於傳入的是j的引用,函式返回後j仍指向棧中l的空間。而函式返回時並沒有修改棧中各個單元的值,只是將指標指向中斷入口前,因此這時*j的值為20。
當呼叫any_function_use_local_variables()時,原來l的空間將被b的值覆蓋,所以返回時再次輸出*j的值時就變成100了,棧如下:
┃ ┃┣━━━━━┫
┃ c=100 ┃
┣━━━━━┫
┃ b=100 ┃<---j
┣━━━━━┫
┃ a=100 ┃
┣━━━━━┫
┃ 中斷入口 ┃
┣━━━━━┫
┃ ┃棧中的內容很容易隨著函式的呼叫而發生改變,通過這個例子可以得出,在使用指標時,不要輕易將指標指向棧中的空間,除非你有十成的把握。
不要輕易使用TerminateThread中止執行緒
聽過無數次不要terminatethread,只是工作中常用,貌似也沒有什麼問題。今天在高強度測試中發現了乙個不可原諒的錯誤。參看下面的例子 dword stdcall mythread void int tmain int argc,tchar argv 為什麼死鎖呢?new操作符用的是小塊堆,整...
return不能返回指向棧記憶體的指標
棧是臨時的 當跳出棧時,其指標對應的值被下次壓棧替換掉 可能每次出棧時,系統可能會對剛才壓棧的記憶體初始化 include uisng namespace std char getstring int main 此程式中,return返回的是指向棧記憶體的位址,程式編譯警告,因為給該內存在函式結束時...
不要傷害指標(2) 指標的型別和指標所指向的型別
在談論指標之前,永遠記住指標的四要素 指標的型別,指標所指向的型別,指標指向的記憶體區,指標自身佔據的記憶體。指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據...