Фрагмент кода:
#include <new>
char buffer[512];
int main()
{
double *pd;
pd = new (buffer) double[5];
delete [] pd;
return 0;
}
Это зависает только при использовании новой формы нового оператора.
Я использую следующие инструменты и параметры:
> cl -EHsc foobar.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005
Microsoft (R) Incremental Linker Version 12.00.21005.1
Вы не выделили эту память, поэтому не пытайтесь ее освободить (с delete []
).
В общем, вы будете запускать деструкторы:
for( i = 0; i < 5; i++ ) {
T* p = pd + i;
p->~T();
}
Но для double
это не нужно.
pd = new (buffer) double[5];
То, что вы там делаете, заключается в повторном использовании памяти, занятой buffer
для создания массива double. Итак, теперь вы удаляете память, которую вы не выделяете new
.
Не делай этого. Программа не выделяла память operator new
или operator new[]
, поэтому его не следует удалять.