【发布时间】:2015-05-29 01:40:18
【问题描述】:
我很无聊,想做一个程序来让我的电脑崩溃:P。我会让它无用且冗余地分配内存,直到崩溃。到目前为止我创建的代码在这里:
#include <cstdlib>
#include <cstdio>
int main(int argc, const char *argv)
{
int n = 0;
while (1)
{
n++;
int* buffer = (int*)malloc(n ^ n);
int* buffer_buffer = (int*)calloc(n, sizeof(buffer));
for (int i = 0; i < n; i++) {
printf("%p", &buffer);
printf("\n");
buffer_buffer[i] = (int)buffer;
}
}
}
代码工作(它使计算机崩溃),但没有按预期工作。我想更深入地了解它的工作原理以及它到底在做什么,所以我设置了一些断点并决定一步通过这。我希望看到buffer_buffer 一次又一次地重新分配,其中包含n 数字buffer,但事实并非如此。相反,我的调试器显示buffer_buffer 包含一个有时会更改的值,并且每次循环都会记录一个值(至少我希望buffer 的整数转换)。我期待 buffer_buffer 每次 for 循环出现时都会随着 n 的元素数量增长,但它只有一个元素。为了可视化这一点,这里是调试器的屏幕截图:
我又有点累了,这可能是我的循环逻辑的问题。有谁知道为什么我的程序会遇到这种意外行为?我正在使用 Microsoft Visual Studio 调试器
【问题讨论】:
-
旁注:
^是按位异或,所以malloc(n ^ n)将分配零字节的内存。 -
@sth 从技术上讲,它将请求零字节;该实现可能会返回一个空指针,或者一个不允许您取消引用的非空指针。无论如何,某些实现可能会分配内存。
-
还不清楚您期望内部循环的主体做什么。
buffer在此循环期间永远不会被修改,因此&buffer和(int)buffer每次检查时都是相同的。
标签: c++ pointers memory-management calloc