c++中strcpy的替代方案
Posted
技术标签:
【中文标题】c++中strcpy的替代方案【英文标题】:Alternative of strcpy in c++ 【发布时间】:2011-06-12 16:39:42 【问题描述】:在 C 中,我使用 strcpy
来制作字符串的深拷贝,但在 C++ 中使用 strcpy
还是 'fine' 还是存在我应该使用更好的替代品吗?
【问题讨论】:
您的字符串是否终止? ***.com/q/4691608/176769 【参考方案1】:我把它放在上面的评论中,只是为了让代码可读:
std::string a = "Hello.";
std::string b;
b = a.c_str(); // makes an actual copy of the string
b = a; // makes a copy of the pointer and increments the reference count
所以如果你真的想模仿strcpy
的行为,你需要使用c_str()
复制它;
更新
需要注意的是,C++11 标准明确禁止了以前在std::string
的许多实现中使用的常见写时复制模式。因此,不再允许引用计数字符串,以下将创建一个副本:
std::string a = "Hello.";
std::string b;
b = a; // C++11 forces this to be a copy as well
【讨论】:
我不认为你可以说“c_str()
复制”:它只返回原始的char*
数据。然后将此数据传递给执行实际复制的 std::string 构造函数。如果它没有被复制,那么一旦 a 超出范围或被销毁, b 就会失效。
我没有说c_str()
复制。我说b = a.c_str()
复制了字符串。 c_str()
不是操作的重点;复制赋值运算符是。
我要求进行编辑以使问题更清晰。如果有任何问题,请随时执行回滚。【参考方案2】:
在 C++ 中,最简单的方法通常是使用 std::string 类而不是 char*。
#include <string>
...
std::string a = "Hello.";
std::string b;
b = a;
“b = a;”行执行与 strcpy 相同的操作。
【讨论】:
除此之外,strcpy 在 C++ 中与在 C 中一样合法和危险。std::string
的operator=
实际上并没有做深拷贝。它执行引用计数的副本(因此,不完全像strcpy
所做的那样)。如果要对 std::string
进行深层复制,则需要这样调用它:std::string a = "Hello."; std::string b; b = a.c_str();
以强制它实际进行复制,而不是仅仅复制指针并增加引用计数。
@Zac Howland、@Aerus:不一定,而且现在比以前少了。写时复制是语言允许但不要求的实现细节。虽然过去一些库使用它,但事实是它在多线程环境中效率低下,因为它需要锁定,无论是否制作副本都会产生成本,从而在大多数情况下使整体性能更差。
@Zac:我主要使用 g++,其中字符串不使用写时复制。我刚刚查看了 VC2010 标头,那里的字符串实现也不使用写时复制。 SO中至少有一个问题表明VC2008也没有写时复制(或至少默认情况下没有)。我的猜测是,少数(如果有的话)仍然具有写时复制的编译器将在不久的将来将其删除。现在趋势是多核处理,锁定的开销超过了COW的优势
g++ 从什么时候开始不使用写时复制字符串了?一个简单的测试证明g++使用了COW。在赋值中使用 c_str() 是进行深度复制的方法,因为它的实现独立。【参考方案3】:
如果您使用的是 c++ 字符串,只需使用复制构造函数:
std::string string_copy(original_string);
赋值运算符
string_copy = original_string
如果您必须使用 c 风格的字符串(即以 null 结尾的字符数组),那么是的,只需使用 strcpy,或者作为更安全的替代方案,strncpy。
【讨论】:
啊不错的选择,没想到:)【参考方案4】:建议您使用 strcpy_s,因为除了目标和源参数之外,它还有一个额外的目标缓冲区大小参数以避免溢出。但是,如果您使用 char 数组/指针,这仍然可能是复制字符串的最快方法。
例子:
char *srcString = "abcd";
char destString[256];
strcpy_s(destString, 256, srcString);
【讨论】:
以上是关于c++中strcpy的替代方案的主要内容,如果未能解决你的问题,请参考以下文章