2012-05-27 33 views
9

我讀安德烈Alexandrescu的的的d編程語言,發現這個金塊在拆除順序:d:保證毀滅

... d假定退出該應用程序將事實上釋放與它相關的所有資源,所以它不會調用任何析構函數。

這對內存資源非常適用,但網絡套接字,自定義硬件,文件句柄等事情呢?有沒有辦法保證我的析構函數是總是調用?另外:D是否提供了一種更好的方式來處理這些事情(並且我陷入了C++的心態)?

+0

在** C++ **中,在未處理的異常情況下有類似的情況。 –

+0

@ K-ballo:正確,但在正常*應用程序退出期間,我似乎無法保證所有對象都將被銷燬。這很不方便。 –

+0

@TravisGockel你可以編輯問題以包含頁碼嗎? – Arlen

回答

6

您可以使用static destructor它被調用的線程終止和被調用上(正常)的應用程序關閉的shared static destructor

(現在,只要我們有弱引用,所以我們就不需要間接的另一個層次。 ..)

3

其他人已經提到了模塊級別的析構函數,但這並不實際,因爲它需要太多的手動維護,而且D有一個惱人的怪癖,那就是具有靜態構造函數/析構函數的模塊不能進行循環導入。例如:

模塊A

module A; 
import B; 
static ~this() {} 
void main() {} 

模塊B

module B; 
import A; 
static ~this() {} 

嘗試運行...

% dmd A.d B.d 
% ./A 
Cycle detected between modules with ctors/dtors: 
A -> B -> A 
[email protected]/rt/minfo.d(331): Aborting! 

d執行此以防萬一你的破壞者碰巧依賴對方,即使他們不相互依賴。這迫使你對你的代碼進行奇怪的「重構」來解決這個非問題。沒有辦法告訴D,實際上沒有依賴關係。

處理資源破壞的更好的解決方案是儘可能地嘗試和範圍。沒有需要銷燬的全球資源,也不要依賴類終結器來完成任何事情,因爲它們不能保證運行有史以來(Java有同樣的問題)。

或者,只要像C:手動關機那樣做。這是一個更多的工作,但真的不是一個大問題。這當然比遏制循環進口更容易。

0
  • 殺死進程會清除進程內部的所有內容。
  • 沒有辦法阻止操作系統在有時間清理過程之外的事情之前終止進程(如果存在的話,甚至會失去功率)。

在這兩者之間,一切都被覆蓋了,所以假設你對事物的關閉有一個說法是毫無意義的。