【问题标题】:Clearing data at a memory address清除内存地址处的数据
【发布时间】:2018-04-12 23:01:55
【问题描述】:

我环顾四周,找不到太多有关如何执行此操作的信息,但是如何清除特定内存地址处的内存?

假设我的内存地址值为:0x12345 我需要编写什么代码来清理该空间中的任何内容?

最好是 C 或 C++

【问题讨论】:

  • 如果您还没有指向该地址或包含该地址的内存块的指针,您可能不想更改该内存。
  • 你从哪里得到那个内存地址,你的操作系统甚至允许你访问它吗?你也试过做什么? (你所说的“清理”到底是什么意思?
  • 如果您没有提供理由并保证您的实施是有效的,那么回答这个是不负责任的。
  • 我有一个 Java 程序,我想在不使用 GC 的情况下手动清除内存,正计划将内存地址传递给 C++ 程序(或类似程序)并让它清理内存。

标签: c++ memory


【解决方案1】:

我需要编写什么代码来清理该空间中的任何内容?

视情况而定。

要了解你需要编写什么代码,首先你需要知道 (1) 什么样的对象存储在那个地址中。然后,您必须决定 (2) 在该对象的上下文中“清理”是什么意思。一旦你有了这些问题的答案,你就可以知道需要编写什么代码了。

示例:内存地址 0x12345 包含 int 类型的对象,我想通过将该整数的值设置为 0 来“清理”该内存。然后您可以这样写:

auto ptr = (int*)0x12345;
*ptr = 0;

如果你不知道问题 1 和 2 的答案,那么你根本无法“清理”。


注意使用整数作为内存地址是非常可疑的。我们如何知道该内存地址中有一个int 对象?通常您使用 addressof 运算符获取对象的地址。在这种情况下,指针应该已经是适当的类型,因此需要进行强制转换。

【讨论】:

  • 我确切地知道内存位置中的对象类型。将其设置为 0 应该如何完成?
  • @SurajKumar 如果对象的类型是 int 并且如果您打算将值设置为 0,则可以。
  • @SurajKumar 那么它的值不会改变。
  • 那么我将如何删除数据?所以那个内存插槽可以用于某事/其他人?
  • @SurajKumar 这取决于内存是如何分配的。
【解决方案2】:

大锤回答你的问题(但我闻到了 XY 问题)

unsigned char * p = (unsigned char*)0x12345;
*p = '\0'; 

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 2021-11-23
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    相关资源
    最近更新 更多