C++ : memory management

标签 c++ c arrays pointers memory-management

<分区>

我已经使用 new 分配了 5 个 int 空间,并尝试访问超出分配边界的 (array[size] = 2; )。理想情况下,它应该抛出一些错误,但事实并非如此。

int size = 5;
int* array = new int[size];

array[1] = 2;

//If I uncomment below line it gives me error

//array[size] = 2; 

cout << array[1] << endl;

// Why this is not an problem
cout << array[size] << endl;

delete[] array;

但是当我试图删除这个分配的空间时,它显示了这个错误。

*** glibc detected *** /home/workspace/PracticeC++/Debug/PracticeC++: free(): invalid next size (fast): 0x08add008 ***
PracticeC++: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

当我在评论 array[size] = 2; 行后尝试删除时,它工作正常。我无法理解这种奇怪的行为。根据我的理解,delete[] 运算符具有有关数组大小的信息,因此它不应超出该大小,并且此错误与我们尝试删除相同内存两次或未分配的情况有关我们。谁能告诉我这个错误背后的原因。

最佳答案

C 和 C++ 都没有边界检查,因为这会降低性能并需要额外的簿记数据。您的内存分配器可能会保存额外的信息,但仅供其私有(private)使用并以其私有(private)格式使用。您可能已经使用了自己的/根本没有使用过它,因此它不可靠。
越过不属于自己的内存时遇到的未定义行为是程序员的责任。任何事情都可能发生。

关于C++ : memory management,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22884985/

相关文章:

c++ - 如何使用模板化 C++ 结构定义 C-forward 声明的不透明结构

c++ - 高于 FullHD 分辨率的帧丢失。MediaFoundation 中是否提供 AVI 解压缩器转换过滤器?

C++ 读取 PE 可选 header 以确定 DEP 和 ASLR

android - 为什么我在android内核中遍历内核模块中目录的dentry时不能正确提取所有文件名?

c - 为什么 fwrite libc 函数比 syscall write 函数快?

php - 引用 - 这个错误在 PHP 中意味着什么?

c++ - 错误 LMK2019 : unresolved symbol/fatal error LNK1120: 1 unresolved externals

c - 大端和小端差异的位运算

javascript - JQuery - 多个按键检测

java - 使用Arraylist复制三维数组不安全?