这一切都正确吗?
没有一个例子是正确的。
char* dest = new char;
你已经分配了一个char
. 它可以表示的唯一字符串是空字符串。
char* c = new char;
c = "Richard";
通过分配c
指向其他地方,您丢失了由new
. 因此,您不能再将该值传递给delete
. 这称为内存泄漏。
此外,由于 C++11,这是格式错误的,因为字符串文字不再可转换为指向非 const char 的指针。格式错误意味着编译器不需要编译您的程序,而是需要向您发出诊断消息,通知您格式错误。
strcpy_s(dest, strlen(c) + 1,c);
您应该传递目标缓冲区的大小;不是源数据的大小。在这种情况下,目标缓冲区太小,但是因为您传递了错误的值,所以错误没有被捕获并且行为未定义。
正如我提到的,传递目标缓冲区的大小:
auto error = strcpy_s(dest, 1, "Richard");
这会安全地导致错误而不是未定义的行为 - 或者它可能会安全地中止程序或根据实现执行其他操作。您可以控制约束处理程序以获得所需的行为。
当然,您可能希望分配足够的内存以便复制工作:
std::size_t destsz = 1024;
char* dest = new char[destsz];
你知道你分配的大小。只需将其传递给strcpy_s
:
auto error = strcpy_s(dest, destsz, "Richard");
不要忘记清理:
delete[] dest;
PS C++ 标准库不提供strcpy_s
. 这是一个非标准功能。它仅在 C 语言中是标准的(但提供它的实现是可选的)。
PSS 不要new
用于分配字符串。std::string
在 C++ 中使用。你std::string
可以像这样复制:
std::string c = "Richard";
std::string dest = c;
使用这种方法更难泄漏内存或产生更严重的错误。