我有这样的课:
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 to名memory 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)
您可能检测到 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. 在这种情况下,name并kot->name成为具有相同(复制)内容的两个完全独立的字符串。从那时起,更改/删除一个不会影响另一个。
| 归档时间: |
|
| 查看次数: |
6734 次 |
| 最近记录: |