【问题标题】:C++: create a pointer in a program and access that location in another programC++:在一个程序中创建一个指针并在另一个程序中访问该位置
【发布时间】:2020-06-04 21:44:47
【问题描述】:

那么,是否可以像这样在 C++ 中创建一个指针并打印出来:

#include <iostream>
int main() {
    int* ptr = new int;
    (*ptr) = 3;
    std::cout << ptr << '\n';
}

然后运行它,复制 ptr 的值,并在另一个程序中,当它运行时,这样做:

#include <iostream>
#include <cstring>
int main() {
    long long pointer;
    std::cin >> pointer;
    int* ptr = nullptr;
    std::memcpy(&ptr, &pointer, sizeof(pointer));
    std::cout << *ptr << '\n';
}

然后打印出 3?有没有可能,如果没有,那究竟是为什么?

【问题讨论】:

  • 我认为您正在寻找所谓的管道或共享内存。
  • 好吧,我不想将它用于某些目的,或者至少现在,这主要是一个理论问题。
  • 这是不可能的。程序使用从操作系统获得的虚拟内存。一个程序中的内存地址通常不会与不同程序中的相同地址指向相同的位置。
  • @Andrew 因为问题是目前写的,所以无法回答,因为这是特定于 API 和操作系统的。我们能做的最好的事情就是说“管道或共享内存”,这是做这类事情的一般机制。但还有其他方法。
  • 看起来是 XY 问题。您可以查看 Boost.Interprocess 以获取在进程之间共享数据的一些血腥细节(正如其他人已经指出的那样,这不像共享指针值那么容易)。

标签: c++ pointers memory heap-memory


【解决方案1】:

这在标准 c++ 中是不可能的。这是因为程序内存是虚拟的,您无法访问其他程序的内存,因为它们位于单独的虚拟内存中。管道可以满足您的需求。

【讨论】:

    【解决方案2】:

    这在标准 C++ 中是不可能的。标准 C++ 没有程序s 的概念。就语言而言,只有一个程序 - 目前正在翻译的程序。

    在 C++ 标准之外,确实存在多任务操作系统,可以同时运行多个进程(您现在可能正在使用一个)。此类操作系统使用虚拟内存,一个进程不能直接访问另一个进程的虚拟内存。

    如果您有足够的权限,例如使用process_vm_readv 系统调用(特定于Linux)在技术上是可行的。在使用这种技巧之前,您必须以某种方式传达您想要读取的进程 ID 和虚拟地址,这些在第一个程序运行之前是未知的。

    尽管有可能,但这可能不是您需要做的事情,除非您正在实施调试器或类似工具。如果您只是想要这个以便进程可以通信,还有其他方法。没有 C++ 标准的方式,因为 C++ 不知道进程,但是例如 POSIX 标准指定了许多进程通信的方式:共享内存、文件、网络套接字等。

    【讨论】:

    • 感谢您的回复!我试了一下,还是不行,第二个程序在第二个程序中打印出一些随机值
    • @Andrew 您所做的事情可能有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多