2015-08-16 3 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; 

как я могу избежать двойное удаление?

В этом слишком упрощенном сценарии я знаю, что могу проверить адреса указателей, чтобы убедиться, что они равны и условно удалить только один из них, но есть ли лучшее решение, когда я не буду знать, что указатели могут указывать на такая же память?

Edit:

прибрано вещи, чтобы избежать некоторой путанице ..

+5

* «Как я могу избежать двойного удаления?» * Это не злобно, поэтому не читайте его как таковое - [не используйте 'new'] (http://stackoverflow.com/questions/ 6500313 /). –

+1

И не используйте 'delete' либо –

+1

Ваш код не имеет двойного удаления в любом случае,' input' и 'output' указывают на разные буферы. Локальные переменные с одинаковыми именами внутри 'test' не влияют на переменные вне функции. –

ответ

6

Вообще говоря, лучший способ избежать двойного удаления, чтобы не выделять память непосредственно new. Есть различные умные указатели, которые можно использовать как scoped_ptr и shared_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

Способ избежать двойных удалений, чтобы создать свой код так, что право собственности на объекты хорошо определены. Одновременно может быть только один владелец объекта, хотя собственность может передаваться от одного владельца к другому. Владелец объекта может быть частью кода (например, функцией) или структурой данных. Когда владелец делается с объектом, владельцем является ответственность за передачу права собственности на что-то другое или уничтожение объекта.

Смежные вопросы