簡體   English   中英

使用信號處理程序釋放資源?

[英]use signal handler to release resources?

我寫了一個套接字服務器。 而且我意識到,當我在運行Ctrl-C時按下它時,可能會發生內存泄漏。 我用valgrind找到了。

我的服務器代碼很簡單。 基本上,我創建一個Listener對象,啟動一個線程以接受連接並嘗試加入該線程:

 try {
    Server::Listener listener(1234);

    boost::thread l(boost::bind(&Server::Listener::start, &listener));

    l.join();

} catch(exception& e) {
    cout<<e.what()<<endl;
}

當我運行valgrind時,它給了我:

== 3580 ==命令:bin / Debug / p_rpc
== 3580 ==
列表器已啟動...
循環中
^ C == 3580 ==
== 3580 ==堆摘要:
== 3580 ==在出口使用:24塊中的3176個字節
== 3580 ==總堆使用量:28個分配,4個空閑,4,328個字節分配
== 3580 ==
== 3580 ==丟失記錄21之24中可能會丟失1個塊中的288個字節
== 3580 ==在0x4C29E46:calloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
== 3580 ==通過0x4012084:_dl_allocate_tls(dl-tls.c:297)
== 3580 ==通過0x4E3AABC:pthread_create @@ GLIBC_2.2.5(allocatestack.c:571)
== 3580 ==通過0x5260F9F:boost :: thread :: start_thread()(in
/usr/lib/libboost_thread.so.1.49.0)== 3580 ==通過0x407B93:boost :: thread :: thread,boost :: _ bi :: list1>>(boost :: _ bi :: bind_t,boost: :_bi :: list1>> &&)(thread.hpp:171)
== 3580 ==通過0x404CA4:main(main.cpp:179)
== 3580 ==
== 3580 ==泄漏摘要:
== 3580 ==絕對丟失:0字節,位於0塊中
== 3580 ==間接丟失:0字節(0塊)
== 3580 ==可能丟失:1個塊中的288個字節
== 3580 ==仍可到達:2,888字節,共23塊
== 3580 ==已抑制:0字節,0塊
== 3580 ==未顯示可訪問的塊(找到指針的塊)。
== 3580 ==要查看它們,請重新運行:--leak-check = full --show-reachable = yes
== 3580 ==
== 3580 ==有關檢測到和抑制的錯誤的計數,請重新運行:-v
== 3580 ==錯誤摘要:1個上下文中有1個錯誤(抑制:2個中有2個)
被殺

指出可能有288字節丟失。 我想我可以使用信號處理程序來釋放此資源。 但是我不知道該怎么做。 你能給我一個例子嗎?

干杯,埃爾頓

進程關閉時,操作系統會自動清除該進程擁有的所有內存。 您無需擔心程序退出時釋放該內存。 該建築物正在拆除。 不要打掃地板,倒空垃圾桶和擦除白板。 而且不要在建築物的出口排隊,這樣每個人都可以將自己的進/出磁鐵移出。 您要做的只是讓拆除團隊等待您完成這些毫無意義的房屋清潔任務。

需要擔心的那種泄漏的是那些程序的生命周期內連續泄漏。

原則上,您可以在那里銷毀物體。 在信號處理程序中您可以執行的操作受到限制,並且它們與線程的混合非常糟糕。 請注意,在這方面的編譯器可以做到沒有 (或很少)檢查,信號處理程序只是一個普通的功能。 要格外小心。

對這些問題的答案這個問題,就如何做到這一點的一些細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM