Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 新数组位置的析构函数_C++_Memory_Placement New - Fatal编程技术网

C++ 新数组位置的析构函数

C++ 新数组位置的析构函数,c++,memory,placement-new,C++,Memory,Placement New,我还没有找到这个问题的答案: T * blockPtr = static_cast<T*>(malloc(nb*sizeof(T))); new (blockPtr) T[nb]; // use my blockPtr array // call destructors (?) free(blockPtr); T*blockPtr=static_cast(malloc(nb*sizeof(T)); 新的(块状PTR)T[nb]; //使用我的blockPtr阵列 //调用析构函数(

我还没有找到这个问题的答案:

T * blockPtr = static_cast<T*>(malloc(nb*sizeof(T)));
new (blockPtr) T[nb];
// use my blockPtr array
// call destructors (?)
free(blockPtr);
T*blockPtr=static_cast(malloc(nb*sizeof(T));
新的(块状PTR)T[nb];
//使用我的blockPtr阵列
//调用析构函数(?)
免费(blockPtr);
在这种情况下,调用析构函数的正确方法是什么?我应该手动循环每一项并调用每一个析构函数,还是有一个特定的语法在一次调用中实现这一点? 我知道,在类T上调用
delete[]
时,像MSVC这样的编译器通常在幕后有一个特定的“向量析构函数”来完成此操作

我应该手动循环每个项目并调用每个析构函数吗

是否有一个特定的语法可以在一次调用中执行此操作

没有



我希望你真的需要这样做

使用
placement new
时,您必须自己调用析构函数:

void * blockPtr = malloc(nb*sizeof(T));
T * block = new (blockPtr) T[nb];

// use block array ...

// call destructors
for (int i = 0; i < nb; ++i)
    block[i].~T();

free(blockPtr);
void*blockPtr=malloc(nb*sizeof(T));
T*block=new(blockPtr)T[nb];
//使用块数组。。。
//调用析构函数
对于(int i=0;i
是的,您应该手动循环并调用析构函数。欢迎来到
C++
,在那里您可以停止
malloc
免费
运行东西@赛博感谢蝙蝠侠2,但我的问题是关于新的总体布局,在那里我可以通过任何可能的方式获得初始内存指针way@SleuthEye我不认为这与位置删除有任何关系,出于所有的意图和目的,我可能想销毁我的对象,但会释放很多内存later@SleuthEye:不太好,否…用模板“placementArray”换行。。。ops std::vector不是已经有了“emplace_back”?@DarioOO:是的,但这对你没有帮助,除非你想让vector管理整个预先分配的内存块;如果是这样,我们一开始就不会使用这种方法。