c++ - char * string 的直接分配与动态分配

标签 c++ c string pointers

我使用 C++ 已经有一段时间了,但有一个基本概念我无法理解。首先,我将列出两种将文本字符串分配给 char * 的方法。

方法一:

char * str = "Hello World";

方法二:

char * str = new char [12];
strcpy(str,"Hello World");

我对方法二很熟悉,方法一让我很头疼。我的问题是

  1. 这两种方法之间的根本区别是什么?有什么优点/缺点吗?
  2. 我应该为方法 1 手动清理内存吗?
  3. 方法 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/

相关文章:

c++ - 如何用字符串文字初始化 const char []

c++ - 在一个循环中对 2 个 vector 进行操作的问题

c++ - QT : Templated Q_OBJECT class

c++ - 从 double 到无符号 64 位整数的安全转换

string - Perl6 有检查子串匹配的方法吗?

c++ - 如何在 Visual Studio Code 中使用 g++ 编译和运行 cpp 文件?

即使使用 -lwininet 链接器标志,C++ wininet 也 undefined reference

一个简单的 C 程序是否可以模仿默认的 'xxd' 命令,使其 diff 输出返回 0?

c++ - 为什么 std::string.find() 不能用于 "<"?

c# - 如何从文本文件中读取特定行并将它们存储为字符串。 C#