简体   繁体   English

Android NDK堆分配问题

[英]Android NDK Heap Allocation Issue

I'm currently trying to figure out exactly how the Android Native heap works: I'm allocating some memory on the heap via new, then printing the address of the pointer to see where the memory was allocated. 我目前正在试图弄清楚Android Native堆的工作方式:我通过new在堆上分配了一些内存,然后打印指针的地址以查看内存的分配位置。 However, it seems that the address of the memory allocation doesn't follow a simple pattern, for example when I try: 但是,似乎内存分配的地址没有遵循简单的模式,例如当我尝试执行以下操作时:

//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);

The result I get from the logs is: 我从日志中得到的结果是:

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

Which doesn't make any sense to me, because the address of pInt2 is larger than the address of pInt1, but pInt3 is less than both pInt1 and pInt2, and so on. 这对我来说没有任何意义,因为pInt2的地址大于pInt1的地址,但pInt3小于pInt1和pInt2,依此类推。 When I allocate memory for a large array of integers (pInt8 and pInt9), it seems the location of where the memory was allocated on the heap will change as well, and it looks arbitrary to me. 当我为大型整数数组(pInt8和pInt9)分配内存时,似乎在堆上分配内存的位置也会发生变化,并且对我来说似乎是任意的。

Can anyone explain this? 谁能解释一下? Or how exactly the Android NDK heap works? 还是Android NDK堆到底如何工作? I expect the heap to grow in just one direction and I also expect to be fully contiguous, which clearly it's not from my experiment, so I don't really know what's going on. 我希望堆仅在一个方向上增长,并且我也希望它是完全连续的,这显然不是我的实验所致,所以我真的不知道发生了什么。

new返回的地址是一个虚拟地址,系统要花更多的精力来随机化这些地址,从而使某些黑客攻击更加困难。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM