【问题标题】:Dynamic memory allocation in C++ language [duplicate]C ++语言中的动态内存分配[重复]
【发布时间】:2021-03-19 01:29:33
【问题描述】:

我想在 C++ 中为 char 数组(字符串)分配空间。当我为 10 个字符分配内存时,我还可以为 char 数组分配更多字符。当我打印它时,它会从数组中给出一些额外分配的字符。

#include <string.h>

using namespace std;

int main()
{
    char *name = new char[10];

    strcpy(name, "MoreThanTenCharacters");

    cout << name << endl;
}

虽然分配的内存是 10 个字符,但我可以分配更多。打印给出完全相同的值。其背后的逻辑是什么?

【问题讨论】:

  • 您正在调用未定义的行为。 C++ 不像其他语言那样在内存管理方面进行手动操作。为什么?表现。任何类型的检查 = 附加指令 = 执行它们所花费的时间。
  • 最佳经验法则:从不在 c++ 中使用 newdelete 手动管理内存,除非您 100% 确定您需要,以及您需要什么正在做。对于您想要实现的目标,请使用 std::string 句号。以下是 C++ 中动态内存管理所需的一切:123
  • &lt;string.h&gt; 是 C 标头。在 C++ 中,您宁愿使用 &lt;string&gt; 以及其中的所有好东西(而相应的 C++ 标头是 &lt;cstring&gt;
  • 这能回答你的问题吗? Undefined, unspecified and implementation-defined behavior 仔细查看已接受答案中的第一个示例。
  • 如果你解释你期望你的程序做什么,这个问题可能会更积极。你认为程序应该打印一条消息吗?你认为strcpy 应该在 10 个字符后停止吗?你认为代码不应该编译吗?

标签: c++ dynamic-memory-allocation


【解决方案1】:

当第一个参数指向的缓冲区比第二个参数指向的字符串短时(考虑到空终止符),那么副本会将缓冲区溢出到周围的内存中,程序的行为是不确定的。

打印给出完全相同的值。其背后的逻辑是什么?

您已观察到一些行为。这是当行为未定义时程序可能具有的可能行为的示例。

那么,为 JUST 10 个字符分配内存并为其分配字符串的正确方法是什么?

您的分配是正确的,但并不理想。使用裸指针是不安全的;最后你泄漏了分配。这是你的错误发生的地方。

一个有效而简单的选择是使用std::string。如果您的目标是存储输入的 10 个字符长的前缀子字符串,那么以下是正确的:

std::string name("MoreThanTenCharacters", 10);

【讨论】:

  • 那么,为 JUST 10 个字符分配内存并为其分配字符串的正确方法是什么?
  • strcpy_s 如果您确实需要。但在 C++ 中,通常的做法是使用std::string,并消除 10 字符的限制。
  • @asgarov 你不明白吗?你分配了 10 个字符,然后在那里写了太多,只有 Richi 知道它们写在哪里。最好的方法是根本不这样做。或者您必须使用 c++ 功能,而不是从 C 继承的 stdlib 函数。最常见的情况是 strncpy。此外,10 个字符数组只能容纳 9 个字符长的字符串。
  • @asgarov 查看编辑。
  • @MooingDuck strcpy_s 的问题在于它在 C++ 中是非标准的,即使在 C 中它也是可选的,并且并非由所有标准库实现(并且支持它的一种实现并不)甚至支持指定的标准 API)。
猜你喜欢
  • 2011-09-13
  • 2017-10-02
  • 2020-02-16
  • 2021-01-16
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多