2016-08-18 89 views
1

我必須修改一個非常大的方法,並有許多可能的執行流程。修改涉及使用new在堆中分配char數組。我想確定這個數組是否正確釋放,但我想避免在所有可能的執行流程中執行delete[]。另外,爲了避免未來的錯誤,我希望爲此做一些「更清潔」的事情。C++(而不是C++ 11)在非常大的方法中釋放數組的最佳方法

我已經想與new到ALLOC陣列,然後將其包裝到一個本地std::vector(但保持參考原始指針,因爲該方法使用該參考集中),並讓包裝刪除原始指針時,它是超出範圍。

這裏附上一個例子。這個例子的目的是顯示用原始指針執行的操作類型。

char *rawPtr = new char[1024]; 
std::vector wrapper(rawPtr, rawPtr + 1024); // <= Does it assure that rawPtr will be released properly? 
... 
for(int i = 0; i < 1024; i++) 
    rawPtr[i] = ...; 

rawPtr += sizeof(...); 
... 
rawPtr -= ...; 
if(...) 
    return ...; 

return ...; 

所以,我的問題是,如果我能肯定的是,rawPtr將被釋放正確不管程序故障,異常,進入return報表等

PD:我不能使用C++11,最相似我得到一個智能指針的東西是auto_ptr,這使用delete,而不是delete[]

+2

您是否熟悉術語RAII?如果是這樣,你的問題是什麼? –

+1

製作你自己的RAII包裝... –

+0

爲什麼不使用'std :: string'? – NathanOliver

回答

5

您可以創建長度爲1024的vector<char>,然後使用指向其第一個元素的指針作爲rawPtr。那麼不需要撥打newdelete[]

+0

在這種情況下,我更喜歡保留對原始指針的引用,因爲該方法非常大,並且這個原始指針被大量使用(我想盡可能少地改變它)。所以,我想知道std :: vector是否確保指針將被釋放,即使您有對原始指針的引用。 – Dan

+0

是的,std :: vector將在析構函數中釋放它的內存,即使你仍然有指向它的元素的指針 –

+0

@你可以通過執行'&vec.front()'獲得一個原始指針。這個指針的行爲*就像現在的原始指針一樣,所以你有完全一樣的東西,你想要的。 –

2

std::vector沒有new ed指針的移動構造函數。會發生什麼,是一個副本是爲std::vector的使用。所以你仍然需要刪除。

+0

所以,如果我做了'std :: vector a(new char [....]);'我仍然需要引用'new char [']'來刪除它?有沒有其他方法可以用乾淨的方式執行刪除操作? – Dan

+1

@Dan這個構造函數不存在。您無法獲取矢量來管理外部分配的數組。這根本行不通。使矢量分配數組,然後使用指向該數組的指針。這是你想要的。 –

+0

是的,我提到:char x = new char [X];矢量 a(x,x + X)。在這種情況下,vector會收到像@stackptr所說的副本? – Dan

相關問題