C++:内存管理
C++ : 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.
当我在注释数组[大小] = 2 后尝试删除时; 行它工作正常。 我无法理解这种奇怪的行为。根据我的理解,delete[] 运算符具有有关数组大小的信息,因此它不应超过该大小,并且此错误与我们尝试删除两次或未由我们分配的内存的情况有关。有人可以告诉我此错误背后的原因吗?
C 和 C++ 都不是边界检查,因为这会降低性能并需要额外的簿记数据。您的内存分配器可能会保存额外的信息,但仅供其私人使用和专用格式保存。您可能已经使用了自己的/根本没有使用它,因此它不可靠。
在未拥有的内存上违规时遇到的未定义行为是程序员的责任。任何事情都可能发生。
通过执行此操作来覆盖一些关键信息array[size] = 2;
malloc 函数(或新运算符)存储有关您分配的内存块的一些信息,这些信息刚好超出分配的块。当您释放内存时,delete
会使用这些信息。
仅当您读/写不属于您的进程的内存时access violation
您才会收到错误。当您写入进程分配的内存时,您不会收到任何错误。但是,您可能会在代码中的其他地方遇到一些奇怪和意外的结果(就像您在这里的情况一样)。
编译器没有真正的理由在这里抱怨,因为你使用的是指针。您基本上可以使指针变量指向操作系统允许的任何可能的内存位置。当您超出程序的内存分配时,将发生分段错误。
如果要避免无意中访问此类索引,则必须使用标准数组,或者更好的选择是使用 C++ 中提供的向量。
在已分配的内存之外写入会导致未定义的行为。这意味着任何事情都可能发生,不同的实现可能会做不同的事情。不需要在编译期间或运行时发生错误。
据推测,在您正在使用的实现中,分配器将某些信息存储在分配给您的内存块旁边的内存区域中。
覆盖其中一些信息会导致尝试释放该内存时出现问题。
但是你真的不能对程序在这一点上的行为做出任何假设。这就是为什么它被称为未定义的行为。
- 当vector是tje全局变量时,c++中vector的内存管理
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 可以通过非原始指针来增强容器矢量管理内存
- 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留,...),但实际上将 As 保留在 B 之前,连续
- 线程管理内存泄漏
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 管理内存C++
- ptr_vector如何管理内存
- 在C++Builder/Firemonkey中使用表单创建来管理内存
- 如何正确管理内存(运行时)C++
- 在Node.js中使用Native Abstractions时,如何管理内存
- ostream是如何管理内存的
- C++中管理内存泄漏的问题
- OpenCL:在 CPU 上而不是在 GPU 上更正结果:如何正确管理内存
- deque是如何管理内存的
- 用c++/cli互操作管理内存
- 如何衡量管理内存所花费的时间
- (加速C++)章节管理内存
- 如何在此场景中管理内存