这是我在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]);
}
(Token
是vector<string>
和SS
和int
)
我知道这不推荐,我知道它不优雅,我知道那里 这个阵列的创建和填充是很多其他解决方案,但我需要这样做 就这样
我现在遇到的问题是删除数组。当我分别创建每个std::string
但是使用malloc
分配数组时,在我的析构函数中我写道:
for (int i = 0; i < SS; i++) {
delete (&((string*) TP)[i]);
}
free(TP);
但是在运行时,free(TP)
指责“双重免费或腐败”。
通过评论free(TP)
我解决运行时的问题(隐藏真正的问题),但我需要确保释放所有内存,因为这可能会导致类内的内存泄漏。
那么,删除TP的每个元素是否足以释放所有内存?根据我的理解,malloc
已经独立分配了内存,它需要独立于std::string
元素而自由;但是,为什么我会收到这个错误?
答案 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);