2011-11-29 2 views
2

Какой из них должен использоваться?удаление массива char с помощью cast to char *?

char *ex = new char[255]; 
// code 
delete [] ex; 

или

char *ex = new char[255]; 
// code 
delete [] (char *) ex; 

Я имею в виду, что бросок не нужен, но будет иметь никакого влияния на фактическое удаление?

+1

Актерский ничего не делает, но даже если он сделал ваши два примера будет по-прежнему ведут себя так же, потому что тип операнда в 'удалить []' это 'символ *' в обоих случаях. – Jon

ответ

4
char *ex = new char[255]; 
// code 
delete [] ex; 

Вам не нужно бросать, отливка не будет иметь никакого эффекта.

Стандарт C++ не требует от вас каких-либо отливок. Вот ссылка.

Раздел §3.7.3.2.3:

Значение первого аргумента, подаваемого к одной из функций, предусмотренных Deallocation в стандартной библиотеке может быть нулевым значением указателя; если это так, вызов функции освобождения не влияет. В противном случае значение, указанное в operator delete(void*), в стандартной библиотеке должно быть одним из значений, возвращаемых предыдущим вызовом либо operator new(size_t), либо operator new(size_t, const std::nothrow_t&) в стандартной библиотеке, а значение, предоставленное оператору delete[](void*) в стандартной библиотеке, должно быть одним из значений возвращенный предыдущим вызовом либо operator new[](size_t), либо operator new[](size_t, const std::nothrow_t&) в стандартной библиотеке.

4

Это не необходимо и не имеет никакого эффекта. Вы делаете char* до char*.

0

delete [] уничтожает (или уничтожает) количество объектов, а затем освобождает память. Если тип не является объектом, он просто освобождает память без вызова деструкторов. Это было бы хорошо:

class some_class 
{ 
     some_class(int); 
}; 

.... 
some_class *p = new some_class[[2]](0)(1); 

delete[] p; // delete calculates how many objects where created, and call destructors of all objects, then frees the memory (which is twice sizeof(some_class)