什么是“记忆跺脚”
What is a “memory stomp”?
我刚刚看到这篇提到"踩踏记忆"的博客文章:
一个C++程序,很容易踩踏内存 (如果你是,你可能从未听说过 诞生于托管代码世界。
事实上,我从未听说过它!
那么,这是什么,记忆跺脚,跺脚记忆?什么时候发生?
当一段代码操纵内存而没有意识到另一段代码正在以冲突的方式使用该内存时,内存就会被"踩踏"。有几种常见的方法可以踩踏记忆。
一种是分配,比如说,100字节的内存,然后存储超过第100个地址的东西。这种记忆可能被用来保存完全不同的东西。这特别难以调试,因为当某些东西试图访问被踩踏的受害者时,就会出现问题,而踩在上面的代码可能完全无关。
另一个是在释放内存后访问内存。可以为另一个对象分配内存。同样,显示问题的代码可能与新分配的对象相关,该对象具有相同的地址,而与导致问题的代码无关。
通常它是缓冲区溢出;例如,以下代码:
char buffer[8];
buffer[8] = 'a';
将"踩踏"buffer
之后内存中下一件事中碰巧发生的任何事情.一般来说,"跺脚"是指无意中写入内存。
其他答案基本上是正确的,但我想举一个例子。
int a[10], i;
for (i = 0; i < 11 ; i++)
a[i] = 0;
int i, a[10];
for (i = 0; i < 11 ; i++)
a[i] = 0;
这些样本可能会导致无限循环(也可能不引导),因为它是未定义的行为。
内存中的可变i
很可能存储在数组之后。因此,访问a[10]
实际上可以访问i
换句话说,它可以重置循环计数器。
我认为这是演示记忆"跺脚"的好例子。
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 递归函数有效,但无法记忆
- 如何将记忆应用于此递归函数?
- 共享记忆:让我们谈谈它的特殊性
- 为什么nlohmann不释放记忆
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- C++17 多态记忆资源不起作用
- 我是否漏了记忆?
- 关于记忆后这种递归关系的时间复杂度
- 记忆栅栏和记忆屏障是一样的吗
- 使用记忆在 C++ 中实现 Knapstack
- 无论如何可以将webm / mp4文件编译/记忆为.exe程序吗?(C++)
- 如何在硬币兑换中添加记忆
- 动态记忆的删除是如何真正起作用的
- C++遗传,记忆问题
- 使用未声明的标识符"nothrow";你是说"扔"吗?记忆
- Qt驱动器下拉列表仅列出USB记忆棒
- 我找不到瓦尔格林德告诉我的记忆链接
- 什么是“记忆跺脚”
- 结合纹理记忆统一记忆在CUDA 6