COCO研究院

 找回密碼
 註冊
搜索
查看: 4461|回復: 7

[其他程式語言] 請教一個C++的問題

[複製鏈接]
發表於 15-12-27 01:42 | 顯示全部樓層 |閱讀模式
如果我有一個程式裏面有無窮迴圈,那我強制程式結束的時候,程式會不會執行無窮迴圈之後的程式碼?
‪#‎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配置的記憶體會被釋放出來嗎?如果不會的話,程式應該怎麼寫才是對的?


評分

參與人數 1金錢 +2 收起 理由
googleandy + 2 在假日研究程式,按一個讃!

查看全部評分

發表於 15-12-27 02:39 | 顯示全部樓層
while(1){},除非遇到強制中斷,或是遇到錯誤,不然程式是不會停下來,
後面的程式都不會被執行,就算程式停下來,還是不會被執行
還是要加個條件跳出迴圈比較好
發表於 15-12-27 19:45 | 顯示全部樓層
這是一個程式跟作業系統之間的問題, 也跟您強制停止程式的方法有關,
就您寫的這個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



評分

參與人數 2金錢 +7 收起 理由
comewish + 5 感謝分享
AGWZ + 2 太強了

查看全部評分

發表於 15-12-27 20:28 | 顯示全部樓層
改成以下程式即可, 當有任何一鍵被按了, 即跳出無窮迴圈:

while (1)
{
//Do something

if(kbhit()) break;
}
 樓主| 發表於 15-12-27 22:19 | 顯示全部樓層
carlos.twlin 發表於 15-12-27 19:45
這是一個程式跟作業系統之間的問題, 也跟您強制停止程式的方法有關,
就您寫的這個C++的例子來說, free(ptr) ...

謝謝你的提示,因為我要寫一個Server在那裏等待Client的request,所以會用無窮迴圈等待,只是萬一Server被關閉的話,是不是應該有機會做一些結束的工作,例如通知Client關閉socket或是寫log等等的動作。
發表於 15-12-28 09:29 | 顯示全部樓層
comewish 發表於 15-12-27 22:19
謝謝你的提示,因為我要寫一個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前最後做了什麼事。

評分

參與人數 2金錢 +7 收起 理由
carlos.twlin + 2 按一個讚
comewish + 5 按一個讚

查看全部評分

發表於 15-12-28 11:08 | 顯示全部樓層
用c++寫client-server socket程式?
一直連線著?
Client可試著加Keep alive封包判斷
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
Google一下c++ client server keep alive相關

評分

參與人數 1金錢 +5 收起 理由
comewish + 5 感謝分享

查看全部評分

發表於 15-12-30 10:10 | 顯示全部樓層
keep alive 或 keepalive 有兩種

作業系統本身設定或AP自己寫
作業系統設定會影響所有TCP連線,不同作業系統有不同的設法,設定完成時間值固定
AP自己寫時間要多長多短可依需求隨時調整
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-12-2 17:53

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |