Проблема выделения кучи в Android NDK - PullRequest
0 голосов
/ 18 ноября 2018

В настоящее время я пытаюсь выяснить, как именно работает собственная куча Android: я выделяю некоторую память в куче через new, затем печатаю адрес указателя, чтобы увидеть, где была выделена память. Однако, кажется, что адрес выделения памяти не следует простому шаблону, например, когда я пытаюсь:

//native-lib.cpp (in in Android App)

int *pInt1 = new int();
int *pInt2 = new int ();
int *pInt3 = new int ();
int *pInt4 = new int ();
int *pInt5 = new int ();
int *pInt6 = new int ();
int *pInt7 = new int ();
int *pInt8 = new int [100000];
int *pInt9 = new int [99999999];
int *pInt10 = new int ();

__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 1:", "%p\n", pInt1);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 2:", "%p\n", pInt2);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 3:", "%p\n", pInt3);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 4:", "%p\n", pInt4);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 5:", "%p\n", pInt5);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 6:", "%p\n", pInt6);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 7:", "%p\n", pInt7);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 8:", "%p\n", pInt8);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 9:", "%p\n", pInt9);
__android_log_print(ANDROID_LOG_ERROR, "ADDRESS INT 10:", "%p\n", pInt10);

Результат, который я получаю из журналов:

E/ADDRESS INT 1:: 0xacb78ac0
E/ADDRESS INT 2:: 0xacb78b10
E/ADDRESS INT 3:: 0xacb78ab8
E/ADDRESS INT 4:: 0xacb78a00
E/ADDRESS INT 5:: 0xacb78a10
E/ADDRESS INT 6:: 0xacb78a18
E/ADDRESS INT 7:: 0xacb78a88
E/ADDRESS INT 8:: 0xb3900000
E/ADDRESS INT 9:: 0x89c00000
E/ADDRESS INT 10:: 0xacb78a90

Это не имеет никакого смысла для меня, потому что адрес pInt2 больше, чем адрес pInt1, но pInt3 меньше, чем и pInt1 и pInt2, и так далее. Когда я выделяю память для большого массива целых чисел (pInt8 и pInt9), кажется, что расположение места, где была выделена память в куче, также изменится, и это выглядит для меня произвольно.

Может кто-нибудь объяснить это? Или как именно работает куча Android NDK? Я ожидаю, что куча будет расти только в одном направлении, и я также ожидаю, что она будет полностью смежной, что явно не из моего эксперимента, поэтому я не знаю, что происходит.

1 Ответ

0 голосов
/ 18 ноября 2018

Адрес, возвращаемый new, является виртуальным адресом, и система делает все возможное, чтобы рандомизировать эти адреса, чтобы затруднить некоторые хакерские атаки.

...