默认动态内存大小

Default dynamic memory size

本文关键字:内存 动态 默认      更新时间:2023-10-16

我有以下代码:

#include <iostream>`
using namespace std;
int main() {
    char* data = new char;
    cin >> data;
    cout << data << endl;
    return 1;
}

当我输入 26 个 1 的char*作为字符串文字时,它会编译并打印它。但是当我做 27 个作为数据时,它中止了。我想知道为什么。

为什么是27?

它有什么特殊的意义吗?

你只分配了一个角色的空间。 因此,读取任何超过此值的数据都会覆盖您不拥有的内存,因此这是未定义的行为。 这就是你在结果中看到的。

您必须

在C++实现的引擎盖下查看具体细节。可能是malloc的实现,等等。代码写入缓冲区的末尾,根据C++标准,缓冲区为 UB。要了解为什么它的行为如此,您需要知道应该存储在您覆盖的 27 或 28 字节中的内容,而您不应该这样做。

最有可能的是,27 个恰好是您开始破坏内存分配器用于跟踪分配和可用块的数据结构的点。但是对于 UB,您可能会发现行为并不像最初出现的那样一致。作为一个C++程序员,你并没有真正"有权"知道这些细节,因为如果你知道它们,那么你可能会开始依赖它们,然后它们可能会在不通知的情况下改变。

动态分配一个字节的存储空间。要分配倍数,请执行以下操作:

char* data = new char[how_many_bytes];

使用字符串文本时,将自动分配如此多的堆栈空间。动态分配时,必须正确分配字节数,否则将出现段错误。

这只是

未定义的行为,又名"UB"。该程序可以做任何事情或什么都不做。您看到的任何效果都是不可重现的。

为什么是UB?

因为您为单个 char 值分配了空间,并将其视为以零结尾的字符串。由于零占用一个char值,因此没有(保证)空间用于实际数据。但是,由于C++实现通常不会添加低效的事物检查,因此您可以将数据存储在不属于您的内存部分中 - 直到它崩溃或产生无效结果或产生其他不良影响,因为 UB。

要正确执行此操作,请使用 std::string 而不是 char* ,并且不要newdeletestd::string会自动为您执行此操作)。

然后使用 std::getline 将一行输入读入字符串。