C++ 使用原始内存地址查找指针/类

C++ 使用原始内存地址查找指针/类,c++,air-native-extension,C++,Air Native Extension,在问我的问题之前,我想说我意识到有一些“类似”的问题,但没有(我能找到)具体回答我的问题,所以现在开始 我想知道是否有可能做到以下几点。假设我创建了一个类的新的实例,如下所示: MyClass* classInstance = new MyClass(); 我想知道是否可以把原始内存地址存储在一个原始类型,比如int。然后,C++中的某个地方,没有一个指向“代码>类实例< /C>”的指针,我可以这样做: MyClass* myClassInstanceSomewhereInMemory = (

在问我的问题之前,我想说我意识到有一些“类似”的问题,但没有(我能找到)具体回答我的问题,所以现在开始

我想知道是否有可能做到以下几点。假设我创建了一个类的
新的
实例,如下所示:

MyClass* classInstance = new MyClass();
我想知道是否可以把原始内存地址存储在一个原始类型,比如int。然后,C++中的某个地方,没有一个指向“代码>类实例< /C>”的指针,我可以这样做:

MyClass* myClassInstanceSomewhereInMemory = (MyClass*)0x12345678;
myClassInstanceSomewhereInMemory->workPlzKThx(); //Yay, it works!
如果可能,是否存在任何风险?这类事情的间接费用是否有重大成本?我意识到这个设计相当糟糕,但不幸的是,我受到了一位设计师的摆布。因此,请不要因为这件事责怪我,但请放心。:)

对这种疯狂的解释
再进一步解释一下为什么我要做这么愚蠢的事。我正在将box2D移植到一个AIR本机扩展上,正如我前面提到的,我受AIR运行时的支配。它处理本机端和Actionscript端之间关联的方式是。。。更糟糕的是,有一大堆荒谬的规则来做这种关联

一个这样的规则对于像
b2World->createBody()
,返回指向
b2Body
类型(具有私有构造函数)的指针的情况来说是一个真正的问题。在这个关联过程中,我不能同时创建一个上下文来关联新的
b2Body
指针,因为在这个调用过程中,我被困在
b2World
的上下文中。因此,我不想在
b2World
b2Body
之类的类中把一堆肮脏的黑客放在一起,而是想知道我是否可以使用int之类的基本类型来存储和返回新
b2Body
的内存地址


我不能返回一个指针或一个C++类型的结构返回到ActionScript端。我只能联想到上下文。。。但是我可以返回基本类型。

到目前为止,最简单的解决方案是
std::map
。几乎唯一的缺点是,在
UINT\u MAX
分配之后,您必须寻找可重用的值。

到目前为止,最简单的解决方案是
std::map
。几乎唯一的缺点是,在
UINT\u MAX
分配之后,您必须寻找可重用的值。

许多第三方api将迫使您使用这种类型的模式来传递数据。您将遇到的唯一问题是,如果您使用您建议的int基元类型,那么如果您曾经为64位平台编译过,那么此代码将不可移植,因为int基元类型将无法保存64位平台上可用的最大地址。您可以使用内置类型int_ptr,当为32位平台编译时,该类型为32位,而为64位平台编译时,该类型为64位以避免此问题,或者您可以使用void*作为基本类型,如win32 CreateThread函数或pthread_create函数。

许多第三方api将强制您使用此类型的模式来传递数据围绕您将遇到的唯一问题是,如果您使用您建议的int基元类型,那么如果您曾经为64位平台编译过,那么此代码将不可移植,因为int基元类型将无法保存64位平台上可用的最大地址。您可以使用内置类型int_ptr,当为32位平台编译时,该类型为32位,而为64位平台编译时,该类型为64位以避免此问题,或者您可以使用void*作为基本类型,如win32 CreateThread函数或pthread_create函数。

要转换的适当值为
intptr_t
uintptr_t
,但我不认为Adobe有这些

这样,将C++移植性放在一边,仅仅是实用的,如果你是在32位架构中,那么<代码>未签名的INT/COM>应该是好的,在64位,未签名的长,这是一个足够长的整数,以保存指针的值。

未签名
部分只是为了安全起见,但您也应该能够在没有它的情况下玩

您必须注意的主要一点是,从整型类型和转换到整型类型的指针类型必须相同。也就是说,以下是未定义的行为:

class  A {  };
class B : public A {};

B b;
A *pa = &b;
unsigned x = reinterpret_cast<unsigned>(&a);
B *pb = reinterpret_cast<B*>(x); //UB!
A类{};
B类:公共A{};
B B;
A*pa=&b;
无符号x=重新解释强制转换(&a);
B*pb=重新解释铸件(x)//乌布!
最后一行应该是:

A *pb = reinterpret_cast<A*>(x);
A*pb=reinterpret\u cast(x);
否则:

B *pb = static_cast<B*>(reinterpret_cast<A*>(x));
B*pb=static_cast(重新解释_cast(x));

合适的值是
intptr\u t
uintpr\u t
,但我认为Adobe没有这些

这样,将C++移植性放在一边,仅仅是实用的,如果你是在32位架构中,那么<代码>未签名的INT/COM>应该是好的,在64位,未签名的长,这是一个足够长的整数,以保存指针的值。

未签名
部分只是为了安全起见,但您也应该能够在没有它的情况下玩

您必须注意的主要一点是,从整型类型和转换到整型类型的指针类型必须相同。也就是说,以下是未定义的行为:

class  A {  };
class B : public A {};

B b;
A *pa = &b;
unsigned x = reinterpret_cast<unsigned>(&a);
B *pb = reinterpret_cast<B*>(x); //UB!
A类{};
B类:公共A{};
B B;
A*pa=&b;
无符号x=重新解释强制转换(&a);
B*pb=重新解释铸件(x)//乌布!
最后一行应该是:

A *pb = reinterpret_cast<A*>(x);
A*pb=reinterpret\u cast(x);
否则:

B *pb = static_cast<B*>(reinterpret_cast<A*>(x));
B*pb=static_cast(重新解释_cast(x));

> P>你有没有想到把这个“空气本机扩展”加上C++?需要注意的是,我不知道box2d或AIR Native Extension,这让我感到,您可能正在尝试做其他人以前尝试过的事情,也可能是Adobe希望您不要做的事情——可能有充分的理由。例如:

我不能返回指针