让我说我有一个充满字符指针的结构。哪个是使用从函数返回的字符串初始化值的正确方法
typedef struct details{
char *name;
char *address;
char *nickname;
}details_t
string function()
{
string name = "random string calculation";
return string;
}
情形1:
直接指定返回值。这里我不明白string_1.c_str()的结果存储在哪里。它是否在堆中,因为它是字符串类?
main()
{
details_t details_t1;
details_t1.name = function().c_str();
details_t1.address = function().c_tr();
function_2(details_t1);
}
案例2: 在堆中分配内存
main()
{
details_t details_t1;
details_t1.name = (char*)malloc(string_1.size()+1);
strcpy(details_t1.name,string_1.c_str();
....
function_2(details_t1);
}
答案 0 :(得分:2)
两种情况都是错误的:
存储c_str
返回的指针。该指针的生命周期由返回它的字符串控制,因此它独立于details_t
结构。您可能会引用内存区域不再有效,例如你将向字符串追加一些内容,它会重新分配它的内部缓冲区,你的结构仍将指向旧的缓冲区。
您正在使用malloc
分配内存(在C ++中几乎总是错误的)并将此内存分配给结构的成员。这在技术上并不正确,但这不是在C ++中完成的事情。将结构成员分配给具有未知所有者的已分配内存是否为
您应该忘记在结构中使用char*
,只使用std::string
。
答案 1 :(得分:1)
c_str()
是string
类当前具有字符的地方 - 它可能在堆上,它可能使用小字符串优化。如果字符串得到更新,它可能会改变,因为C ++字符串不是不可变的。它可能超出范围。
不要使用选项1。
选项2更安全。然后,您在结构中拥有自己的副本。 但是,不要忘记随后释放内存。 如果你可以做C ++,使用析构函数来整理。 然后考虑复制构造函数等(规则3或5)。
选项3可能更好:
考虑只在内部设置std::string
。 (规则为0)