我遇到如下情况,我不确定结构的std :: string元素是否泄漏内存或者是否正常。调用free(v)
时,这两个std :: strings分配的内存是否被删除?
struct MyData
{
std::string s1;
std::string s2;
};
void* v = malloc(sizeof(MyData));
...
MyData* d = static_cast<MyData*>(v);
d->s1 = "asdf";
d->s2 = "1234";
...
free(v);
是否泄漏?
我正在使用void-pointer,因为我有另一个高级结构,它由一个枚举和一个void-pointer组成。根据枚举变量的值,void *将指向不同的数据结构。
示例:
enum-field具有EnumValue01 =&gt; void-pointer将指向malloc的MyData01结构
enum-field具有EnumValue02 =&gt; void-pointer将指向malloc的MyData02结构
当然,非常感谢对不同方法的建议。
答案 0 :(得分:4)
这是未定义的行为 - malloc()
在未初始化时分配的内存,因此将其用作包含string
个对象的结构可以导致任何内容;我希望崩溃。由于在调用free()
之前没有人调用析构函数,string
对象不会被销毁,它们的缓冲区几乎肯定会泄漏。
答案 1 :(得分:4)
您不应该在C ++程序中使用malloc()
和free()
;它们不是构造函数/析构函数。
使用new
和delete
运营商。
答案 2 :(得分:2)
是的,因为没有调用构造函数和析构函数。使用new
和delete
。
答案 3 :(得分:2)
确实存在泄漏。 free不会调用MyData析构函数(毕竟它是一个C函数,它对C ++的东西一无所知)。您应该使用new / delete而不是malloc / free:
MyData* d = new MyData;
d->s1 = "asdf";
d->s2 = "1234";
delete d;
或者自己调用析构函数:
void* v = malloc(sizeof(MyData));
MyData* d = new (v) MyData; // use placement new instead of static_cast
d->s1 = "asdf";
d->s2 = "1234";
...
d->~MyData();
free(v);
正如尖锐的指出,你不能直接使用malloc分配的内存作为没有初始化的MyData结构,所以你也必须自己做。要使用已分配的内存初始化MyData,您需要使用placement new(参见上面的代码)。
答案 4 :(得分:1)
即使您设法正确初始化s1和s2,只需执行free(d)也不会回收为s1和s2动态分配的任何内存。你应该通过new创建* d并通过delete来销毁,这将确保正确销毁s1和s2(以及初始化)。
答案 5 :(得分:1)
是的,你可能正在泄漏,你的琴弦也没有正确构造。该程序的行为未定义,这意味着一切都会出错。
执行您正在执行的操作的最有效方法是展示位置new
。不过,使用一些常见的基类和适当的C ++多态性你会更好。
如果可能的类型不相关,您可以使用Boost.Any或Boost.Variant。