我已閱讀DDJ中有關範圍警衛(Generic: Change the Way You Write Exception-Safe Code — Forever)的文章,並瞭解他們的常見用法。動態創建範圍警衛
然而,常見的用途是實例化堆棧上的特定堆棧後衛特定的操作,例如:
{
FILE* topSecret = fopen("cia.txt");
ON_BLOCK_EXIT(std::fclose, topSecret);
... use topSecret ...
} // topSecret automagically closed
,但如果我要安排清理操作在運行時,例如什麼當我有一個循環:
{
vector<FILE*> topSecretFiles;
for (int i=0; i<numberOfFiles; ++i)
{
char filename[256];
sprintf(filename, "cia%d.txt", i);
FILE* topSecret = fopen(filename);
topSecretFiles.push_back(topSecret);
ON_BLOCK_EXIT(std::fclose, topSecret); // no good
}
}
顯然,上述例子是行不通的,因爲topSecret
將與沿着範圍被關閉。我想要一個範圍守衛模式,我可以輕鬆地排隊清理操作,我確定需要在運行時。有沒有這樣的東西可用?
我不能將範圍守護對象放到標準隊列中,導致原始對象(我推送的對象)在流程中被解散。如何推送堆分配的堆棧守衛,並使用一個隊列刪除其在dtor上的成員?有沒有人有更聰明的做法?
是的,對於資源析構函數(如文件句柄)來說,RAII是最好的。我只使用範圍守衛來表達那些難以表現爲「資源」的事物,例如 report(OperationStart); ON_BLOCK_EXIT(report,OperationEnd); doSomething(); – Ilya 2009-10-14 12:05:03
遺憾的是,我的編譯器中沒有TR1,所以我無法使用shared_ptr。然而,auto_ptr的向量/隊列可能正常工作(假設我是堆 - 分配我的範圍守衛並將它們推送到向量/隊列中)。我很想知道一些C++類將變得「可移動」(不知道這個術語)。這是用refcounts完成的嗎?也許我應該讓範圍警衛「可移動」呢? –
Ilya
2009-10-14 12:06:13
auto_ptr <...>的vector/queue顯然不是一個好主意,因爲auto_ptrs不可複製! – 2009-10-14 12:58:19