删除在C++中用malloc分配的std :: string数组

Ped*_*rea 0 c++ arrays string memory-management

这是我在以下问题的后续跟进:C++上带有malloc的字符串数组

正如我已经实现托尼d溶液,我已分配的内存用于阵列std::stringmalloc然后创建std:string用于与所述元件中的每一个new根据:

void* TP = malloc(sizeof (string) * SS);
for (int i = 0; i < SS; i++) {
  new (&((string*)TP)[i]) std::string(Token[i]);
}
Run Code Online (Sandbox Code Playgroud)

(Token是一个vector<string>SS一个int)

我知道这不推荐,我知道它不优雅,我知道有很多其他的解决方案来创建和填充这个数组,但我需要这样做

我现在遇到的问题是删除数组.因为我std::string单独创建每个但是数组的分配有一个malloc,在我的析构函数中我写了:

for (int i = 0; i < SS; i++) {
  delete (&((string*) TP)[i]);
}
free(TP);
Run Code Online (Sandbox Code Playgroud)

但是在跑步时,它free(TP)正在指责"双重自由或腐败".

通过评论free(TP)我解决运行时的问题(隐藏真正的问题),但我需要确保所有内存都被释放,因为这可能会导致类内的内存泄漏.

那么,删除TP的每个元素是否足以释放所有内存?根据我的理解,malloc已经独立分配了内存,它需要独立于std::string元素而自由; 但是,为什么我会收到此错误?

Nic*_*pat 6

你正在使用一个placement-new来运行std::stringmalloc分配块上的构造函数,但是你正在使用delete哪个将运行析构函数并尝试释放内存(你不想在这里做第二个)重新释放free()).

你想手动运行析构函数,就像这样......

for (int i = 0; i < SS; i++) {
  (&((string*) TP)[i])->~string();
}
free(TP);
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,"placement new"的匹配操作是"调用析构函数". (2认同)