strdup后如何释放内存?

时间:2016-10-08 17:23:15

标签: c++ memory

我有这样的课程:

class Kot{
public:
    string name;
};

我创建了它的一个实例:

Kot* kot = new Kot;
kot->name = "John";

然后我想创建一个字符串副本:

string name;
name = strdup(kot->name.c_str());

我使用strdup因为我想要delete kot并且仅使用name变量. But I have a 5 bytes memory leak due to名称memory allocation. How can I free it safely? I tried to do delete&amp; name`,但我有:< / p>

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

3 个答案:

答案 0 :(得分:4)

您使用的是free(),而不是delete

the standard documentation

  

strdup()函数应返回一个指向新字符串的指针,即   s指向的字符串的副本。返回的指针可以是   传递给free()。如果是新字符串,则返回空指针   无法创建。

答案 1 :(得分:3)

您可能检测到5字节内存泄漏,但这不是因为string

每次调用strdup都会创建一个与字符串长度相匹配的新char[]。您应该将它绑定到原始指针char*并在某个时候删除它。

您所做的是,您创建了一个临时 char*指针。我们称之为temp用于我们的目的。 然后将temp字符串传递给std::string的构造函数。 std::string生成的另一个副本,原始temp保持不变。

然后temp指针消失,没有正确清除内存。

最后,当std::string对象被销毁时,它会正确地清除它自己的字符串私有副本。但temp之前指出的记忆永远不会被释放。

快速解决方法是:

char* temp = strdup(kot->name.c_str());
name = temp;
free(temp);

然而,你甚至不必那样做!如果您将一个std::string对象分配给另一个,则您已经为其内容制作了正确的副本。所以:

name = kot->name;

很可能完全按照您的目标实现 - 在kot->name内制作name的副本。在这种情况下,namekot->name成为两个完全独立的字符串,具有相同(复制)的内容。从那时起,更改/删除一个不会影响另一个。

答案 2 :(得分:1)

这里有内存泄漏:

name = strdup(kot->name.c_str());

因为您永远不会释放由strdup分配的内存。

要避免此问题,您只需从name

构建kot->name即可
name = kot->name;