gpt4 book ai didi

c++ - strdup 后如何释放内存?

转载 作者:太空狗 更新时间:2023-10-29 23:49:33 29 4
gpt4 key购买 nike

我有这样的类(class):

class Kot{
public:
string name;
};

我创建了它的一个实例:

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

然后我想创建一个字符串的拷贝:

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

我使用 strdup 因为我想删除 kot 并且只使用 name 变量
但是由于
name 内存分配,我有 5 个字节的内存泄漏。
我怎样才能安全地释放它?我尝试执行
delete &name`,但我有:

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

最佳答案

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

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

您所做的是创建一个临时 char* 指针。为了我们的目的,我们称它为 temptemp 字符串随后被传递给 std::string 的构造函数。 std::string 生成了它的另一个 拷贝,而原始的 temp 保持不变。

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

最后,当 std::string 对象被销毁时,它会正确地清除它自己的、私有(private)的字符串拷贝。但是以前由 temp 指向的内存永远不会被释放。

一个快速的解决方法是:

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

但是,您甚至不必这样做!如果您将一个 std::string 对象分配给另一个对象,您就已经为其内容制作了一份适当的拷贝。所以:

name = kot->name;

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

关于c++ - strdup 后如何释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39935218/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com