我有这样的课程:
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)
答案 0 :(得分:4)
您使用的是free()
,而不是delete
。
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
的副本。在这种情况下,name
和kot->name
成为两个完全独立的字符串,具有相同(复制)的内容。从那时起,更改/删除一个不会影响另一个。
答案 2 :(得分:1)
这里有内存泄漏:
name = strdup(kot->name.c_str());
因为您永远不会释放由strdup
分配的内存。
要避免此问题,您只需从name
:
kot->name
即可
name = kot->name;