Встроенный в Android malloc() позволяет выделять ресурсы за пределы ОЗУ, но процесс завершается во время memset; нет обрAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Встроенный в Android malloc() позволяет выделять ресурсы за пределы ОЗУ, но процесс завершается во время memset; нет обр

Сообщение Anonymous »

Я работаю над приложением для Android, которое использует собственный код C/C++ и выполняет выделение больших объемов памяти с помощью malloc().
На устройстве Android 8 ГБ (Android 14+) я неоднократно выделяю большие фрагменты памяти (приблизительно 1 ГБ на выделение) с помощью malloc().
Я наблюдаю следующее:
  • malloc() возвращает ненулевой указатель для каждого выделения
  • Если я не инициализирую или не получаю доступ к выделенной памяти, приложение продолжает работать
  • В этом случае общий выделенный размер может превышать размер физической оперативной памяти устройства
  • Когда я инициализирую память с помощью memset(), приложение завершается после нескольких итераций
  • Сбой происходит во время memset(), а не при вызове malloc()
  • Происходит:

    Нет сбоя malloc()
  • Нет возврата NULL
[*]Процесс внезапно завершается


После завершения logcat показывает такие сообщения, как:
InputDispatcher: channel 'com.example.app/.MainActivity'
~ Channel is unrecoverably broken and will be disposed

Дополнительные сведения:
  • Указатель, возвращаемый функцией malloc(), выглядит действительным до тех пор, пока не будет выполнена memset().
  • Количество успешных выделений варьируется, но сбой постоянно происходит после нескольких больших выделений при доступе к памяти.
  • Приложение определяет приложение подкласс -- Ни onLowMemory(), ни onTrimMemory() не вызывается перед завершением процесса.
Я пытаюсь понять:
  • Почему malloc() позволяет выделять память за пределы физической оперативной памяти, когда к ней нет доступа?
  • Почему процесс завершается во время memset() вместо malloc() возвращает nullptr?
#include
#include
#include

#define ONE_GB (1024ULL * 1024 * 1024)

void allocate_chunks(int iterations) {
for (int i = 0; i < iterations; i++) {
void* ptr = malloc(ONE_GB);
__android_log_print(ANDROID_LOG_INFO, "NATIVE",
"Iteration %d, ptr=%p", i, ptr);

if (!ptr) {
__android_log_print(ANDROID_LOG_ERROR, "NATIVE",
"malloc returned NULL");
return;
}

// Uncommenting the following line causes the app to be killed
memset(ptr, 0, ONE_GB);
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... illed-duri
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»