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

时间:2015-01-21 01:12:32

标签: c++ arrays string memory-management

这是我在Array of strings with malloc on C++

的问题后续跟进

由于我已经实施了Tony D解决方案,我为std::string数组malloc分配了内存,然后为std:string的每个元素创建了new根据:

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

Tokenvector<string>SSint

  

我知道这不推荐,我知道它不优雅,我知道那里   这个阵列的创建和填充是很多其他解决方案,但我需要这样做   就这样

我现在遇到的问题是删除数组。当我分别创建每个std::string但是使用malloc分配数组时,在我的析构函数中我写道:

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

但是在运行时,free(TP)指责“双重免费或腐败”。

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

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

2 个答案:

答案 0 :(得分:6)

你在std::string已分配的块上运行malloc的构造函数,这是一个新的位置,但是你正在使用运行析构函数的delete并尝试释放记忆(你不想在这里做第二个记忆,因为你正在释放free())。

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

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

答案 1 :(得分:1)

首先,让我们清理你的代码。我建议你远离void*你的阵列类型。然后你可以这样做,这更容易阅读,特别是在new()运算符:

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

现在,要释放字符串,你必须直接调用它们的析构函数,不要使用delete(没有 placement-delete 运算符,就像你假设的那样):< / p>

for (int i = 0; i < SS; i++) {
  TP[i].~string();
}
free(TP);

现在,说到这一点,您显然可以访问std::vector,因此没有充分理由使用malloc()代替:

std::vector<std::string> TP(SS);
for (int i = 0; i < SS; i++) {
  TP[i] = Token[i];
}

或者:

std::vector<std::string> TP;
TP.reserve(SS);
for (int i = 0; i < SS; i++) {
  TP.push_back(Token[i]);
}

或者:

std::vector<std::string> TP(Token.begin(), Token.begin()+SS);