内存泄漏,访问释放内存和双重免费之间有什么区别
What is the difference between memory leak, accessing freed memory and double free?
我试图弄清楚与内存模型相关的三种问题之间有什么区别。
如果我想模拟memory leak
方案,我可以创建一个指针而无需调用相应的删除方法。
int main() {
// OK
int * p = new int;
delete p;
// Memory leak
int * q = new int;
// no delete
}
如果我想模拟double free
方案,我可以两次释放指针,此部分内存将在两次分配。
a = malloc(10); // 0xa04010
b = malloc(10); // 0xa04030
c = malloc(10); // 0xa04050
free(a);
free(b); // To bypass "double free or corruption (fasttop)" check
free(a); // Double Free !!
d = malloc(10); // 0xa04010
e = malloc(10); // 0xa04030
f = malloc(10); // 0xa04010 - Same as 'd' !
但是,我不知道什么是accessing freed memory
。有人可以给我一个 accessing freed memory
的例子?
- 内存泄漏不好。
- 双释放更糟。
- 访问释放的内存是 walser 。
内存泄漏
这不是错误。泄漏程序有效。这可能不是问题。但这仍然很糟糕。随着时间的流逝,您的程序将从主机中保留内存,并且永远不会发布。如果主机的内存在程序完成之前已满,您会遇到麻烦。
双释放
根据标准,这是不确定的行为。实际上,这几乎总是由C 运行时呼叫std::abort()
。
访问释放的内存
也未定义的行为。但是在某些情况下,不会发生任何不好的事情。您将测试您的程序,将其投入生产。有一天,出于明显的原因,它会破裂。它将艰难地打破:随机。重新制作简历的最佳时间。
这是如何访问释放内存的方法:
// dont do this at home
int* n = new int{};
delete n;
std::cout << *n << "n"; // UNDEFINED BEHAVIOUR. DONT.
您的内存泄漏示例(分配内存但释放它)和双重(将指针传递给分配的内存到free
/delete
不止一次)是正确的。
执行双重的并不意味着您的示例指示的malloc
将返回一部分内存的一部分。它要做的是调用不确定的行为,这意味着无法预测程序的行为。
访问自由的内存意味着释放指针,然后随后尝试使用它:
int *a = malloc(10 * sizeof(int)); // allocate memory
free(a); // free memory
print("a[0]=%dn", a[0]); // illegal: use after free
您对使内存泄漏和双重漏洞是正确的。当您放弃已释放的指针时,就会发生释放记忆:
int *ptr = malloc(sizeof(int));
*ptr = 123;
free(ptr);
int invalid = *ptr; // Accessing freed memory
这样的问题很难检测到,因为该程序在一段时间内继续按预期工作。如果您期望在以后的某个时间重复使用指针变量,则在调用free
后立即分配NULL
是一个好主意。这样,随后的退解会失败。
我试图弄清楚与内存模型相关的三种问题之间有什么区别。
-
内存泄漏 - 您动态分配内存,永远不会发布。
-
双免费 - 您动态分配内存并多次发布
-
免费后访问 - 您动态分配内存,然后在版本后释放和访问该内存。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 如何在cpp中删除(免费)多维结构内存?
- C++自动内存 malloc 和免费覆盖问题
- 将 C 样式字符串复制到免费存储上分配的内存中
- 内存泄漏,访问释放内存和双重免费之间有什么区别
- OpenCV cv::mat发布免费内存
- 对于使用Cygwin GCC编译的C++程序,是否有免费的内存调试器
- C#提供免费的原生C++内存
- 这个代码会泄露内存吗?我需要免费吗?C++内存
- 如何为队列释放内存?我的不免费
- 免费应用程序检查内存泄漏在Windows x64