“考虑以下场景:
- 用户启动 MyApp。
- 用户关闭 MyApp。
- 用户启动SomeOtherApp。
我的问题是:如果 SomeOtherApp 也动态分配内存,那么操作系统返回的缓冲区之一是否可能包含由 MyApp 调用(现已关闭)放置在那里的敏感数据?
或者 RAM 的内容是否被视为应用程序运行的沙盒的一部分?”
最近有人问我这个问题,我很好奇。做程序或应用关闭后 RAM 会发生什么情况?缓冲区会保留任何数据吗?或者即使程序关闭后,RAM 中还会有对数据的引用吗?
提出这个问题的主要原因是出于安全考虑,假设有人从远程服务器收集数据并使用自定义程序显示数据。一旦该程序关闭,我想确保没有任何东西可以访问我从远程数据库显示的数据。
我主要关注与 iPhone 和其他智能手机相关的应用程序,但 RAM 就是 RAM,我认为它适用于大多数其他领域。
答案1
如果在释放内存之前没有明确或隐式地清除内存,它将保留其中存储的数据。
当您分配一定量的内存时,其中可能包含前一个进程(或应用程序的另一部分)留下的数据。如果自启动以来没有进程占用该内存区域,则该区域很可能是空的(即,它只包含零)。
这就是为什么人们经常将刚刚分配的内存清零(以避免以前的垃圾数据扰乱他们的程序逻辑)。
在某些框架中,可能会有特殊的数据类型,确保在销毁时将其分配的内存清零。一个这样的例子是 .NET安全字符串。
话虽如此,您使用的编程平台或操作系统内存管理器可能会决定始终将内存清零。因此,这实际上取决于您的环境。
有关的
答案2
内存只是操作系统管理的另一种资源。因此,操作系统的行为才是您感兴趣的。在某些环境中,程序可以访问内存的任何部分,这意味着如果 MyApp 没有清除内存内容(通过将 0 写入其占用的所有内存位置),理论上 SomeOtherApp 可以访问该信息。
实际上,大多数“现代”环境都会阻止这种行为,并导致程序崩溃(如果我没记错的话,Windows 有这个“功能”)或出现奇怪的行为。这就是指针应该始终初始化为 NULL 或某个有用值的原因。
简而言之,回答你的问题,这取决于。
答案3
在过去,动态分配内存的程序员还需要“释放”它,同时密切监视他们的程序以确保没有内存泄漏,这会导致程序正在使用的内存在用户使用完程序后很长时间内闲置并占用空间。
现代操作系统的作用之一就是有效地管理这些内存,并检测何时出现内存泄漏并纠正问题。因此,一旦用户关闭某个程序,操作系统就会释放该程序使用的所有内存并允许其他程序访问它。显然,计算机设计总是存在缺陷,因此这种情况不会 100% 发生,但普通用户不会注意到。
为什么当计算机运行异常缓慢时,您必须重新启动计算机?清除 RAM。这一原则今天仍然适用,但由于上述原因,它不再像过去那么有效。
答案4
这看起来就像文件被删除时一样,仍然保留,并且“区域”标记为空闲。如果需要高安全性,则操作系统或应用程序会擦除数据。