2015-08-16 61 views
4

我已閱讀here以及其他地方,刪除同一變量兩次可能是災難性的(即使有多個變量名稱)。如何避免C++中的雙重刪除變量?

假設我有一個函數,它接受一個輸入和輸出數組:

void test(int*& input, int*& output) { 
    if(input[0] == 0) { 
    output = input; 
    } 
} 

並且它可以分配一個指針到另一個可變我使用:

int *input = new int[3]; 
int *output = new int[3]; 

input[0] = 0; 

test(input, output); 

delete[] input; 
delete[] output; 

如何避免的雙刪除?

在這個過於簡化的場景中,我知道我可以檢查指針地址以查看它們是否相等並有條件地只刪除其中的一個,但是當我不知道指針可能指向同樣的記憶?

編輯:

收拾了東西,以避免一些混亂..

+5

*「我怎樣才能避免雙重刪除?」 *這不是表露無疑,所以不要看它是這樣 - [不使用'new'(http://stackoverflow.com/questions/ 6500313 /)。 –

+1

並且不要使用'delete' –

+1

你的代碼無論如何都沒有雙重刪除,'input'和'output'指向不同的緩衝區。 'test'中的相同名稱的局部變量不影響函數外部的變量。 –

回答

6

一般來說最好的辦法,以避免重複刪除是不直接與new分配內存。還有,你可以使用像scoped_ptrshared_ptr各種智能指針,並在你的情況下,你可以使用std::Vector

typedef std::vector<int> Ints; 

void test(const Ints& input, Ints& output) 
{ 
    if(input[0] == 0) { 
    output = input; 
    } 
} 

Ints input(3); 
Ints output(3); 

input[0] = 0; 

test(input, output); 
+0

'input [0] = 0;'和下面的行需要在函數中 –

7

,以避免重複刪除的方法是使物體的所有權被明確定義來設計你的代碼。一次只能有一個對象的所有者,儘管所有權可以從一個擁有實體傳遞到另一個。對象所有者可以是一段代碼(如函數)或數據結構。當擁有者完成一個對象時,擁有者有責任將所有權轉移給其他東西或銷燬該對象。