我使用 C++ 已经有一段时间了,但有一个基本概念我无法理解。首先,我将列出两种将文本字符串分配给 char * 的方法。
方法一:
char * str = "Hello World";
方法二:
char * str = new char [12];
strcpy(str,"Hello World");
我对方法二很熟悉,方法一让我很头疼。我的问题是
- 这两种方法之间的根本区别是什么?有什么优点/缺点吗?
- 我应该为方法 1 手动清理内存吗?
- 方法 1 中字符串的生命周期是多少?只要指针仍然有效,我可以相信它会持续存在吗?我可以更改内容吗(前提是我没有跑到末尾的“\0”)?
我已经阅读了无数的 C++ 教科书和文章。他们都告诉我方法 1 有效,但没有详细说明其影响。我自己的实验没有产生令人信服的结果。
谢谢(也许请原谅我的英语不好)
编辑: 实际上,我在 VS2015 中使用带有 tchar 字符串的 WinAPI 进行编程,方法 1 可以完美编译。 std::string 对于 Unicode 处理很糟糕。
假设您在一个解决方案中有两个项目,一个使用 Unicode,另一个使用多字节,这两个项目使用相同的库。在这个库里面,最好用tchar。 std string 你必须明确地告诉它是哪个版本。
我必须这样做,因为多字节项目是一个 dll,我需要将其注入(inject)到另一个应用程序中。 DLL 的 unicode 版本会使应用程序崩溃,只有多字节版本有效。
最佳答案
char * str = "Hello World";
在 C++ 中被弃用,因为它违反了 const 的正确性。 "Hello World"
是一个 const char[]
,用 char*
指向它是对 undefined behavior 的邀请。因为你可以尝试修改它。如果您想在 C++ 中使用字符串,我建议您使用 std::string
,它可以防止您陷入 C 字符串的众多陷阱。
如果你确实需要一个c字符串,那么你可以使用
char str[] = "Hello World";
这将创建一个正确长度的字符数组并允许您修改内容。
Edit: Actually I am programming using WinAPI with tchar string in VS2015, and method 1 compiles perfectly. The std::string is terrible with Unicode handling.
没有什么可以阻止方法一在大多数编译器上编译,但如果你想符合标准,那么你需要停止使用它。它已被弃用,最终(希望)编译器对它的支持将被删除。
如果您需要 Unicode 支持,则使用 std::wstring
包装 wchar_t*
关于c++ - char * string 的直接分配与动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37440655/