malloc,struct,std :: string和free可能存在内存泄漏

时间:2011-09-30 11:56:27

标签: c++ memory-management stl memory-leaks

我遇到如下情况,我不确定结构的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结构

当然,非常感谢对不同方法的建议。

6 个答案:

答案 0 :(得分:4)

这是未定义的行为 - malloc()在未初始化时分配的内存,因此将其用作包含string个对象的结构可以导致任何内容;我希望崩溃。由于在调用free()之前没有人调用析构函数,string对象不会被销毁,它们的缓冲区几乎肯定会泄漏。

答案 1 :(得分:4)

您不应该在C ++程序中使用malloc()free();它们不是构造函数/析构函数。

使用newdelete运营商。

答案 2 :(得分:2)

是的,因为没有调用构造函数和析构函数。使用newdelete

答案 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.AnyBoost.Variant