2010-07-05 4 views
3
//the setup 
tiles = new Tile **[num_bands]; 
for(int i = 0 ; i < num_bands ; i++) 
tiles[i] = new Tile *[num_spokes]; 

for(int i=0; i < num_bands; i++){ 
    for(int ii=0; ii < num_spokes; ii++){ 
     tiles[i][ii] = 0; 
    } 
} 


//the problem 
delete tiles[1][1]; 

Когда я удаляю плитку, плитки [1] [1] все еще содержат адрес. Я думал, что это должен быть нулевой указатель или 0x0, но его нет. Удаляю ли я это неправильно?Каков правильный способ удаления указателя в массиве?

+2

Правильный способ заключается в том, чтобы внутренне использовать 'std :: vector >' и обернуть вокруг него тонкую двумерную оболочку массива. – sbi

ответ

12

delete не должен указывать указатель; это ваша собственная ответственность, если вы этого хотите.

В принципе, delete просто означает «Мне больше не нужна память по этому адресу, поэтому вы можете использовать ее для чего-то еще». - он ничего не говорит о том, какие указатели ценности указывают на освобожденный адрес.

0

Еще один способ сказать, что другие указали:

1) указывает указатель на место в памяти ,

2) Удалить просто освобождает память о том, куда указывал указатель. Однако указатель останется указывать на одно и то же место.

3) Вы должны свести на нет указатель самостоятельно, если хотите.

0

Если я не рванусь на своем C++, установка указателя = 0 фактически не освобождает память. То, что вы делаете, - это, по сути, утечка всей вашей матрицы.

1

Используйте интеллектуальные указатели, которые освобождают собственные ресурсы. В C++ обычно считается, что очень плохо иметь дело с вашими собственными ресурсами, если вы явно не являетесь классом менеджера ресурсов.

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