0

在我问我的问题之前,我想说我意识到有一些“类似”的问题,但没有(我能找到)专门回答我的问题,所以就这样吧。

我想知道以下是否可能。假设我创建了new一个类的实例,如下所示:

MyClass* classInstance = new MyClass();

我想知道是否可以将原始内存地址存储在像 int 这样的原始类型中。然后,在 C++ no-mans-land 的某个地方,我没有指向 的指针classInstance,我可以执行以下操作:

MyClass* myClassInstanceSomewhereInMemory = (MyClass*)0x12345678;
myClassInstanceSomewhereInMemory->workPlzKThx(); //Yay, it works!

如果有可能,是否有任何风险?这样的事情是否有任何重大的开销成本?我意识到这个非常糟糕的设计,但不幸的是我在这里受到第三方的摆布。所以请不要为此责备我,但请随意责备他们。:)

对这种疯狂的解释
所以只是为了进一步解释为什么我必须做这样愚蠢的事情。我正在将 box2D 移植到 AIR 本机扩展,正如我之前提到的,我受制于 AIR 运行时。它处理本机端和 Actionscript 端之间关联的方式是......搞砸了,而且还有很多荒谬的规则来进行这种关联。

一个这样的规则对于像这样的情况来说是一个真正的问题b2World->createBody(),它返回一个指向一个b2Body类型(它有一个私有构造函数)的指针。在此关联期间,我无法同时创建一个上下文以将新b2Body指针与其关联,因为在此调用期间,我被困在b2World. b2World因此,与其在and之类的类中将一堆肮脏的 hack 一起拍打b2Body,我想知道我是否可以只使用像 int 这样的原始类型来存储和返回 new 的内存地址b2Body

我无法将从 C++ 键入的指针或结构返回到 Actionscript 端。我只能与上下文相关联......但我可以返回原始类型。

4

4 回答 4

2

到目前为止,最简单的解决方案是std::map<unsigned int, MyClass*>. 几乎唯一的缺点是在UINT_MAX分配之后你必须去寻找可重用的值。

于 2012-05-01T12:36:12.193 回答
1

您是否想过标记这个“AIR Native Extension”以及 C++?需要注意的是,我既不知道 box2d 也不知道 AIR Native Extension,这让我感到震惊,您可能正在尝试做其他人以前尝试过的事情,并且可能是 Adob​​e 不希望您做的事情——可能有充分的理由。例如:

我无法将从 C++ 键入的指针或结构返回到 Actionscript 端。我只能与上下文关联......但我可以返回原始类型

您实际上可以在 Actionscript 中使用指针,还是只是将其保留为原始类型,以便可以将其传递回接口?

也许在这种情况下,您可以将指针存储在像地图这样的关联集合中,并将键作为句柄返回。当您将句柄传回时,C++ 端可以查找指针并根据上下文进行适当的转换。这样,您永远不会通过接口本身传递指针,因此您不会受到任何与指针相关的问题的影响。

抱歉,如果您已经在考虑这些问题。

于 2012-05-01T12:55:12.383 回答
1

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

于 2012-05-01T12:42:29.987 回答
1

要转换的适当值是intptr_tor uintptr_t,但我不认为 Adob​​e 有这些......

因此,将 C++ 可移植性放在一边,只是为了实用,如果您在 32 位架构中,那么 anunsigned int应该没问题,而在 64 位中, anunsigned long是一个足够长的整数来保存指针的值。这unsigned部分只是为了安全起见,但你也应该能够在没有它的情况下玩。

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

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 *pb = reinterpret_cast<A*>(x);

要不然:

B *pb = static_cast<B*>(reinterpret_cast<A*>(x));
于 2012-05-01T12:44:07.277 回答