請教一個C++的問題
如果我有一個程式裏面有無窮迴圈,那我強制程式結束的時候,程式會不會執行無窮迴圈之後的程式碼?#include <stdio.h>#include <stdlib.h>int main(void) {
int *ptr = malloc(sizeof(int));
*ptr = 200;while (1)
{
//Do something
}free(ptr);return 0;
}例如以上的程式,prt配置的記憶體會被釋放出來嗎?如果不會的話,程式應該怎麼寫才是對的?
while(1){},除非遇到強制中斷,或是遇到錯誤,不然程式是不會停下來,
後面的程式都不會被執行,就算程式停下來,還是不會被執行
還是要加個條件跳出迴圈比較好 這是一個程式跟作業系統之間的問題, 也跟您強制停止程式的方法有關,
就您寫的這個C++的例子來說, free(ptr); 不會被執行, 如同kuolung所說,是作業系統釋放的。
如果目的只是要在程式結束以前做一些事情(例如存個檔,或通知管理者程式被關掉了),
比較簡單的作法是用 .NET Form 的架構來寫程式,
只要在 Form 的 OnFormClosing event 寫想要做的事情就可以了,
優點是程式開發比較簡單, 正常的按視窗右上方叉叉結束程式, 甚至直接關機,
OnFormClosing 都會被叫來執行,
缺點是如果用windows task manager的方式強制停止的話, OnFormClosing不會被執行。
如果真的有某些特殊原因需要被強制停止還能做的話,
會需要一些operating system level hook,
可以從以下這兩篇介紹的方法開始研究。
http://www.cplusplus.com/forum/windows/100750/
http://stackoverflow.com/questions/3556048/how-to-detect-win32-process-creation-termination-in-c
改成以下程式即可, 當有任何一鍵被按了, 即跳出無窮迴圈:
while (1)
{
//Do something
if(kbhit()) break;
}
carlos.twlin 發表於 15-12-27 19:45 static/image/common/back.gif
這是一個程式跟作業系統之間的問題, 也跟您強制停止程式的方法有關,
就您寫的這個C++的例子來說, free(ptr) ...
謝謝你的提示,因為我要寫一個Server在那裏等待Client的request,所以會用無窮迴圈等待,只是萬一Server被關閉的話,是不是應該有機會做一些結束的工作,例如通知Client關閉socket或是寫log等等的動作。
comewish 發表於 15-12-27 22:19 static/image/common/back.gif
謝謝你的提示,因為我要寫一個Server在那裏等待Client的request,所以會用無窮迴圈等待,只是萬一Server ...
給個我的經驗。
Client-Server架構下,如果Server Crash,那麼
a. 已經連線,則Client會收到斷線訊息。
b. 如果還沒連線,那Client下次要連連不上。
*ServerCrash的時候,作業系統會回收資源,發現他還有連著的Socket時,應該是會讓他發出FIN封包通知對方斷線。但如果Client-Server跨了很多網段(例如美國Client連台灣Server),而某個網段早已斷開,那ServerCrash發出的FIN封包可能不會到達Client,那Client可能會無知無覺。
但如果是ServerCrash後要寫log ,因為已經crash了就沒辦法寫log了,就只能夠改成每收到一條log都寫下來來知道crash前最後做了什麼事。
用c++寫client-server socket程式?
一直連線著?
Client可試著加Keep alive封包判斷
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
Google一下c++ client server keep alive相關 keep alive 或 keepalive 有兩種
作業系統本身設定或AP自己寫
作業系統設定會影響所有TCP連線,不同作業系統有不同的設法,設定完成時間值固定
AP自己寫時間要多長多短可依需求隨時調整
頁:
[1]