图片是否存储在RAM中? 我是一个初学者C++程序员。

图片是否存储在RAM中? 我是一个初学者C++程序员。,c++,file,ram,C++,File,Ram,我编写了一个简单的程序,创建一个字符数组(大小由用户选择),并读取其中以前的信息。通常你可以找到一些有意义的东西,但大部分都是奇怪的角色。我把它输出成一个二进制文件 为什么我经常发现字母表的多个副本? 有可能在我检索到的RAM块内部找到一张图片吗? 我听说过文件签名(头),它在文件中的任何数据之前,但在所有数据之后,“拖车”会在后面吗?当您从分配的内存中读取未初始化的数据时,您将永远看不到来自其他进程的任何数据。您只能看到自己的流程编写的数据。也就是说:你的代码加上你调用的所有库 这是内核的一个

我编写了一个简单的程序,创建一个字符数组(大小由用户选择),并读取其中以前的信息。通常你可以找到一些有意义的东西,但大部分都是奇怪的角色。我把它输出成一个二进制文件

为什么我经常发现字母表的多个副本? 有可能在我检索到的RAM块内部找到一张图片吗?
我听说过文件签名(头),它在文件中的任何数据之前,但在所有数据之后,“拖车”会在后面吗?

当您从分配的内存中读取未初始化的数据时,您将永远看不到来自其他进程的任何数据。您只能看到自己的流程编写的数据。也就是说:你的代码加上你调用的所有库

这是内核的一个安全特性:它从不泄漏进程中的信息,除非特别要求它传输该信息


如果您没有在内存中加载图片,您将永远看不到使用此方法的图片。

假设您的计算机运行Linux、Windows、MacOS或类似的操作系统,则进程使用的内存中永远不会有任何图片,除非您将其加载到进程中。出于安全原因,其他进程使用的内存在分配给您的进程之前会被清除。所有现代操作系统都是这样,多用户操作系统(Unix、VAX-VMS等)在20世纪50年代末或60年代初首次发明以来或多或少都是这样——因为有人发现,当“你的”数据被其他人发现时,这是一种不公平的现象

即使一个进程已经结束,它的内存也会被清除——如果你的密码仍然存储在内存中,那么当读取密码的程序结束时,你希望有人能找到你的密码吗?[保存高度敏感数据(如加密密钥或密码)的程序,通常手动(如在使用代码时,但不等待操作系统在进程结束时清除)清除用于存储此类信息的内存,因为以下调试功能允许随时检查内存内容,并且时间越短,敏感信息泄漏的可能性越小]

一旦将内存分配给进程并再次释放,它将包含该内存中发生的任何内容,因为清除它需要额外的时间,而且大多数情况下,您都希望用其他内容填充它。所以它包含了它碰巧包含的任何东西,如果你在它周围闲逛,你可能会“找到东西”。但这都是你自己的过程

作为调试功能的一部分,大多数操作系统都可以读取另一个进程正在执行的操作(如果您在系统中运行“调试器”,它当然会作为单独的进程运行,但需要能够在调试程序时访问程序,因此需要有读取该进程内存的方法),但这需要比仅仅调用
new
malloc
多一点的努力(您需要拥有额外的权限(超级用户、管理员等),或者是其他进程的所有者)


当然,如果您的计算机运行的是DOS或CP/M,则它没有此类安全功能,并且您可以获得内存中的任何内容(并且您也可以创建指向任意地址的指针并读取它,只要您保持在系统的内存范围内)

因此,需要明确的是,您正在从内存中读取未初始化的数据,并试图找出它可能意味着什么?
为什么我经常会找到字母表的多个副本?
询问编译器的创建者(至少这是可能的原因之一)
是否可以在我检索到的RAM块内部找到图片?
Yes@deviantfan-我使用g++编译器,但分配的内存可能包含来自已结束的前一个进程的数据,对吗?或者内核是否也确保重置该内存?@MaartenBamelis:也已清除。这是基本的安全。请注意,小型嵌入式操作系统可能是一个例外。但“拖车”是否在所有数据之后?以前的头是什么?内存分配周围存储着“其他数据”,在系统中,
new
malloc
不清除数据,那么以前分配的任意剩余数据将存在于您使用的内存中(包括可创建的运行库所做的临时分配,例如,在
cout
期间将整数转换为字符串-类似地,如果按值传递字符串,则会为生成的字符串向量进行新的分配-当然,其他容器类型也会有此类动态分配行为)。