C++:如何复制std :: string *?

17

在c ++中,我如何复制std :: string *?

我想做这样的事情:

std::string *str1 = new std::string("test");
std::string *str2 = strdup(str1);

delete str1;

std::cout << *str2 << std::endl; // result = "test"

1
一个std::string并不是真正的堆栈上的char数组,它只保留一些状态信息,并具有指向存储字符串实际内容的堆上char数组的指针。虽然有一些优化措施使得情况变得复杂,但这基本上就是std::string为您完成的工作。它抽象了原始的char数组。因此,在函数中不要使用指向std::string的指针,而应该像std::string&那样使用引用,甚至最好使用const std::string& - rwols
4个回答

39

如果你真的必须使用指针和动态分配(大多数情况下不需要),那么

std::string *str2 = new std::string(*str1);

在现实生活中,

std::string str1 = "test";
std::string str2 = str1;

6
我相信在这里你不应该使用指针。使用指针会让你需要掌控生命周期,防范异常等等,这只是带来了很多痛苦。
你应该编写的代码是:
std::string str1 = "test";
std::string str2 = str1;

1

你只需要做

std::string *str2 = new std::string(*str1);

但我必须问一下,为什么你首先要使用指针?这有什么问题吗?
std::string str1 = "test";
std::string str2 = str1;

?


我正在学习C++,这是一项练习。我在一个类中有一个std::string *,我需要在“复制构造函数”函数中对其进行初始化。我认为要做到这一点,我需要复制我的字符串,而不是使用my_var(this->var) - Jérémy Pouyet

0

你可以更简单地实现,而不需要调用 new 和 delete。例如:

std::string *str1 = new std::string("test");
std::string *str2 = str1;

std::cout << *str2 << std::endl; // result = "test"

至少在你的例子中,如果有可能在删除 str1 后访问它,最好写成

std::string *str1 = new std::string("test");
std::string *str2 = new std::string( *str1 );

delete str1;
str1 = nullptr;

std::cout << *str2 << std::endl; // result = "test"

不调用 new 和 delete:两个示例仍然使用堆。 - Component 10
@Component 我是在说关于 new 和 delete,而不是 std::string 类在堆上使用内存的事实。 - Vlad from Moscow
1
不确定我是否理解。您说OP可以在不调用“new”和“delete”的情况下更简单(我同意),但是您的第一个示例使用了“new”,第二个示例使用了“new”和“delete”。 - Component 10
我并不太好奇他在这个抽象的例子中为什么使用指针。他没有问什么更好,是使用指针还是不使用指针。他的问题是不同的:如何模拟指向std :: string的指针的函数strdup。 - Vlad from Moscow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接