visualstudio 2012-如何在c++中修改对象已知内存地址
visual studio 2012 - How to modify object knowing memory adress in c++?
晚上好。
我打开了Visual Studio 2012并运行了这样的程序:
double x = 8768130;
cout << &x;
cin.get();
return 0;
它在控制台中写入的地址是003CFBF8
。
然后,我打开了Visual Studio的另一个副本,并试图阅读这篇文章,但我不确定我做得是否正确。在发布之前,我已经在Stack Overflow中进行了搜索,发现我应该做这样的事情:
double* ptr = reinterpret_cast<double*>(0x003CFBF8);
cout << *ptr;
但它产生了异常
Unhandled exception at 0x00A943DD in Project2.exe: 0xC0000005: Access violation reading location 0x003CFBF8.
这是什么意思?我没有访问权限?我做错了?
如果你问我为什么要这么做,我正在从一些书中学习C++,我想看看volatile
是如何工作的。这就是为什么我想:
- 打开第一个程序,初始化变量,写入其地址
- 打开第二个程序并修改写入的地址
- 在第一个程序中写入变量,检查是否一切正常
我打开了另一份Visual Studio。。。
这就是你的问题所在。所有现代系统都使用虚拟内存,这意味着一个进程不允许接触另一个进程的虚地址空间。这是由处理器强制执行的。
您可以在同一进程(程序)中潜在地执行此操作。然而,现代操作系统也支持ASLR(地址空间布局随机化),这意味着每次执行程序时,一段代码或数据可能会加载到不同的虚拟地址。
如果你想访问另一个进程的内存,最好的办法可能是使用操作系统的调试API。具体来说,在Windows上,您可以调用WriteProcessMemory
。
如果你只想玩volatile
(内存可能会从你下面变掉),你应该考虑生成另一个线程,它会定期修改一个全局可访问的变量。
相关文章:
- 迭代时从向量和内存中删除对象
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 对具有动态分配的内存和析构函数的类对象的引用
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 准确了解对象在内存中的映射方式
- 完全释放静态对象内存
- C++ 对象内存管理
- 循环中的自动变量和自动对象内存分配
- 每个对象内存分配有多少开销
- 是隐式创建的默认构造函数,负责分配对象内存
- 使用 make_unique 语句重新分配unique_ptr对象 - 内存泄漏
- C++对象内存布局
- C++对象内存消耗
- 谷歌模拟全局模拟对象内存泄漏
- 静态工厂方法和静态对象内存泄漏
- 关于对象内存布局的假设
- 如果我在管理C++对象内存的目标 C 中混合C++代码,ARC 会处理它