Вдумайтесь в вызов java-объектов, как предотвратить java от изменения местоположения объекта? В C++ один запрашивает JVM для ссылки на объект an, а затем вы выводите его на указатель. Таким образом, проблема очевидна, ваш указатель уже недействителен. Есть идеи?Предотвращение переадресации объекта Java
Рассматривая ответы до сих пор, позвольте мне уточнить. Насколько я понимаю, когда java создает объект, он предоставляет ссылку (эквивалентную указателю), и эта ссылка приводит все другие объекты к ее фактическим данным и методам. При вызове java из C++ вы должны вводить ссылку на указатель и, таким образом, у вас есть местоположение в памяти объекта.
Java поддерживает пулы памяти как можно чище, чтобы оптимизировать фрагментацию выполнения/кучи и т. Д. При этом он может очень хорошо перемещать объекты в разные пулы памяти, тем самым изменяя фактический адрес памяти на опорные точки (внутренне, в jvm) и обновляет список ссылок, так что все остальные объекты Java могут по-прежнему обращаться к тем же объектам правильно.
Мой вопрос доходит до того, что в C++, поскольку они не являются контрактом между исполняемой средой C++ и JVM, вы передаете ссылку на указатель, который теперь указывает на физический адрес в памяти. Если JVM перемещает объект в процессе оптимизации, будет ли этот указатель на C++ теперь некорректным в долгосрочной перспективе java-программы?
Надеюсь, это поможет прояснить вопрос.
"Изменение местоположения"? Что это значит? В Java нет указателей, таких как C/C++. Ссылки относятся к объектам, живущим на вашей куче, нигде больше. – duffymo
Является ли ваш вопрос о том, как Java может перемещать объекты, а C++ не может, или как, если вы используете JNI для взаимодействия с JVM, указатели, которые вы используете, не заканчиваются плохо? – templatetypedef
См. Также http: // stackoverflow.com/questions/8764683/is-it-possible-to-find-the-address-of-a-non-primitive-variable-in-java – Raedwald