是否有可能从内存泄漏中获取数据?

时间:2015-03-05 11:18:44

标签: c memory-leaks

是否可以通过其他程序从内存地址获取内存泄漏的数据?如下面的代码:

struct Person {
    char *name;
    int age;
    int height;
    int weight;
};
struct Person *who = malloc(sizeof(struct Person));
who->name = "STACK";
who->age = 23;
who->height = 72;
who->weight = 55;

如果我没有免费free(who);那么是否可以从该内存地址获取数据?

2 个答案:

答案 0 :(得分:2)

内存泄漏和从其他进程访问数据是两个无关的事情。

是否泄漏,内存被操作系统限制为单个进程。

要访问其他进程内存,您需要在Windows上向操作系统询问具有ReadProcessMemory()等特定功能的操作系统。 通常它需要管理员权限级别。

现在"泄漏"。当您反复无法释放内存块时会发生泄漏,因此随着时间的推移,不会回收越来越多的进程内存,从而导致不必要的内存消耗增加。

当你释放内存块时,内存分配器本身可能会在其中写入一些bookkeping和/或调试数据,因此释放内存块可能会改变其内容,即使以后没有重新分配(和很可能被新内容覆盖。)

从间谍"它不知道给定进程如何使用它,内存只是一大块二进制数据,所以在" live"之间没有区别。或者"泄露"分配块。

"间谍"了解间谍过程记忆组织,可以精确解码其数据,或者只需要猜测。

答案 1 :(得分:1)

如果您没有初始化内存/结构,那么'谁是'它的点将包含该内存位置已存在的内容,如果使用结构的成员变量检查该内存,则很可能会得到非常奇怪的结果,因为内存可能包含任何内容。该内存可以包含当前程序中较早活动的值或实际上由前一过程设置的内存。在调试器中查看时,这可能让您感到困惑吗? 在运行时,一个进程无法查看另一个进程内存 - 除非您创建共享内存。

如果使用calloc而不是malloc,则首先将返回的内存清除为0。

The Difference Between Calloc and Malloc