c++: delete vs delete[]

vladan67

как освободить память,если забили ее так:
char* ss = new char [300]
?

disna

delete[] ss;

Bird_V

а разве не просто delete ss ?
и кстати, в чём разница между delete и delete[] ?

kokoc88

В данном случае сработает одинаково. Разница в том, что при удалении массива вызываются деструкторы.

poi1981

>В данном случае сработает одинаково
вроде бы стандарт этого совсем не гарантирует

evgen5555

delete[] вызывает деструктор для каждого элемента

Codcod

Разницы нет... посмотрите откомпилированый код.
Просто синтаксис, что бы на глаз отличить что удаляется один объект или массив.

erotic

Разница есть, правильно сказал: если удаляешь массив объектов, то delete[] вызовет деструктор для каждого из них, а delete просто освободит память.

Codcod

repeat: посмотрите откомпилированый код.

erotic

repeat: в случае простых типов разницы нет. вопрос вроде как исчерпан.

Realist

hint: совпадение откомпилированного кода не является достаточным условием отсутствия разницы

Codcod

С чего это?

Alexander08

Ещё скажи что это не одно и тоже.
это не одно и тоже!

Realist

Потому что работоспособность и идентичность кода на конкретной версии конкретного компилятора не гарантирует его правильности и работоспособности в других условиях.
Действительно, для любого вменяемого компилятора разница будет в вызове/невызове деструктора. Конкретный пример будет работать во всех вменяемых условиях.
НО Надо писать delete[] для массивов и delete для одиночных элементов, потому что это правильно, и не заморачиваться.

Codcod

Совпадение генетического кода не является условием однообразия животных.
При чем я совершенно согласен что delete и delete[] одинаковые только с случае простых типов.

Dasar

> При чем я совершенно согласен что delete и delete[] одинаковые только с случае простых типов.
так обычно бывает, но никто не гарантирует, что так бывает всегда.
можно даже постараться и найти реальный ситуацию/компилятор, в котором даже для простых типов код будет разный.

kokoc88

можно даже постараться и найти реальный ситуацию/компилятор, в котором даже для простых типов код будет разный
Ну попробуй.

Dasar

если new перегружать, то код разные не будет?

evgen5555

Для простых типов не перегрузишь

Dasar


void * operator new[](size_t i)
{
std::cout << "new[] " << i << std::endl;
return malloc(i);
};
void * operator new(size_t i)
{
std::cout << "new " << i << std::endl;
return malloc(i);
};


int main(array<System::String ^> ^args)
{
int * arr = new int[5];
int * p = new int(4);
return 0;
}

Dasar

Выводы:
1. даже для простых типов при использовании delete вместо delele[] можно легко словить core dumped
2. если в частном случае код совпадает, то это совсем не означает, что он будет совпадать всегда
Оставить комментарий
Имя или ник:
Комментарий: