我正在寫一個函數,它有很多返回點(取決於什麼條件是真實的),它在不同的點執行一堆new
。在每個返回點,我需要做的一組delete
是不同的。即使如此,我也不想在不同的地方做他們。什麼是處理這個問題的好方法?在C++(或任何其他語言)中優雅的控制流程
一些細節:讓我們考慮一個功能:
int MainClass::testFunction() {
numThreads++;
char *a = new char[100];
// Some computation with a
if (condition1) {
numThreads--;
return -1;
}
char *b = new char[100];
// Some computation with b
if (condition2) {
numThreads--;
return 42;
}
// Some more stuff.
numThreads--;
}
現在,return -1
之前,我需要做的delete a
而return 42
之前,我需要做的delete a; delete b;
。你可以想象如果我有多個返回點,這可能會變得複雜。
這裏是我的解決方案:
解決方案一:把所有刪除在函數結束時,把一些標籤,存儲在折返點的返回值,並使用goto
(是的,骯髒的字眼!)到執行這些刪除後跳轉到適當的刪除並返回。
在上面的例子中,我可以說
superset:
delete b;
subset:
delete a;
numThreads--;
並把goto superset
return 42
和goto subset
前return -1
之前。
我不喜歡這個解決方案,原因很明顯! :-)
第二種解決方案:我可以構建一個內部類實例,並對該類實例的變量執行new
。像這樣...
int MainClass::testFunction() {
class Local {
char *a, *b;
Local() : a(NULL), b(NULL) {}
~Local() { if (a != NULL) delete a; if (b != NULL) delete b; }
};
Local l = Local();
l.a = new char[100];
// Some computation with a
if (condition1) {
return -1;
}
l.b = new char[100];
// Some computation with b
if (condition2) {
return 42;
}
}
那麼,什麼問題呢?那麼,如何訪問該方法中的變量numThreads
?我想在Local
和numThreads--
的構造函數中執行numThreads++
,在Local
的驅動程序中。如果有幫助,testFunction
也是另一個類的成員函數。
感謝您的閱讀。
更新:在堆棧上分配數組絕對是一種可能性,但我遇到堆棧溢出(ah ...這個網站的名稱:-))在堆棧上執行大的分配(堆棧大小爲線程是默認2MB)。我想在這個問題上解決的是一般資源獲取和銷燬。
看起來很有希望。我會試試這個。順便說一下,在非'new'內存中刪除'會導致錯誤。我試過了。 :-) –
刪除將只接受兩件事:由'new'返回的東西,或NULL。其他任何東西都是未定義的行爲。 –