strdup后如何释放内存?

Ken*_*tov 4 c++ memory

我有这样的课:

class Kot{
public:
    string name;
};
Run Code Online (Sandbox Code Playgroud)

我创建了它的一个实例:

Kot* kot = new Kot;
kot->name = "John";
Run Code Online (Sandbox Code Playgroud)

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

string name;
name = strdup(kot->name.c_str());
Run Code Online (Sandbox Code Playgroud)

我使用strdup是因为我只想delete kot使用name变量. But I have a 5 bytes memory leak due tomemory allocation. How can I free it safely? I tried to dodelete &name`,但我有:

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
Run Code Online (Sandbox Code Playgroud)

Cyg*_*sX1 6

您可能检测到 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);
Run Code Online (Sandbox Code Playgroud)

但是,您甚至不必这样做!如果您将一个std::string对象分配给另一个对象,则您已经对其内容进行了适当的复制。所以:

name = kot->name;
Run Code Online (Sandbox Code Playgroud)

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