默认动态内存大小
Default dynamic memory size
我有以下代码:
#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*
,并且不要new
或delete
(std::string
会自动为您执行此操作)。
然后使用 std::getline
将一行输入读入字符串。
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 对具有动态分配的内存和析构函数的类对象的引用
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 调用析构函数以释放动态分配的内存
- 为什么类和 main() 函数中也有动态内存分配
- 将静态内存更改为动态C++
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 在运行时为动态分配的内存输入值
- c++ 动态内存 堆栈中的分配
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 给定特定内存地址的数组的动态内存分配
- 释放动态内存时C++错误
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它
- 给定内存地址的内存动态初始化
- 删除指针分配的内存(动态数组)