【发布时间】:2012-05-01 12:21:02
【问题描述】:
在我问我的问题之前,我想说我意识到有一些“类似”的问题,但没有(我能找到)专门回答我的问题,所以就这样吧。
我想知道以下是否可能。假设我创建了一个类的 new 实例,如下所示:
MyClass* classInstance = new MyClass();
我想知道是否可以将原始内存地址存储为原始类型,例如 int。然后,在 C++ no-mans-land 的某个地方,我没有指向 classInstance 的指针,我可以这样做:
MyClass* myClassInstanceSomewhereInMemory = (MyClass*)0x12345678;
myClassInstanceSomewhereInMemory->workPlzKThx(); //Yay, it works!
如果有可能,是否有任何风险?这样的事情是否有任何重大的开销成本?我意识到这个设计很糟糕,但不幸的是我受制于third party here。所以请不要为此责备我,但请随时chastise them。 :)
对这种疯狂的解释
所以只是为了进一步解释为什么我必须做一些像这样愚蠢的事情。我正在将 box2D 移植到 AIR 本机扩展,正如我之前提到的,我受制于 AIR 运行时。它处理本机端和 Actionscript 端之间关联的方式是......搞砸了,而且还有很多荒谬的规则来进行这种关联。
这样的规则对于像b2World->createBody() 这样的情况会产生真正的问题,它返回一个指向b2Body 类型(它有一个私有构造函数)的指针。在此关联期间,我无法同时创建一个上下文以将新的b2Body 指针与其关联,因为在此调用期间,我被困在b2World 的上下文中。因此,与其在b2World 和b2Body 这样的类中将一堆肮脏的hacks 一起拍打,我想知道我是否可以使用像int 这样的原始类型来存储和返回新b2Body 的内存地址。
我无法将从 C++ 键入的指针或结构返回到 Actionscript 端。我只能与上下文关联......但我可以返回原始类型。
【问题讨论】:
-
唯一的风险是转换为错误的类类型或转换为释放指针。没有开销,只需静态转换网络类指针。
-
所以我的代码可以正常工作吗?将地址存储在什么类型的对象中然后重新调用它是安全的?
-
我认为您尝试做的事情违反了严格的指针别名规则。
-
这和指针有什么区别?您只想将其存储在通用内存中吗?以后你将如何识别类型?
-
有可能。不过,通常不建议提供这样的原始内存地址。但我真的不明白指针有什么好处。