iPhone Memory Leaks

segfault не является намеченным действием Вашей программы C, которая сказала бы Вам, что индекс выходит за пределы. Скорее это - непреднамеренное последствие неопределенного поведения.

В C и C++, если Вы объявляете массив как

type name[size];

, Вам только разрешают получить доступ к элементам с индексами от 0 [до 113]. Что-либо за пределами того диапазона вызывает неопределенное поведение. Если индекс был около диапазона, по всей вероятности Вы читаете память своей собственной программы. Если индекс был в основном вне диапазона, по всей вероятности Ваша программа будет закрыта операционной системой. Но Вы не можете знать, что-либо может произойти.

, Почему C позволяет это? Ну, основная суть C и C++ не должна обеспечивать функции, если они стоят производительности. C и C++ использовался целую вечность для высоко производительности критические системы. C использовался в качестве языка реализации для ядер и программ, где доступ из границ массива может быть полезным для получения быстрого доступа к объектам, которые лежат смежные в памяти. Наличие компилятора запрещает, это было бы ни для чего.

, Почему это не предупреждает об этом? Ну, можно поместить предупреждение уровней высоко и надеяться на милосердие компилятора. Это называют качество реализации (QoI). Если некоторый компилятор использует открытое поведение (как, неопределенное поведение) для выполнения чего-то хорошего, это имеет хорошее качество реализации в том отношении.

[js@HOST2 cpp]$ gcc -Wall -O2 main.c
main.c: In function 'main':
main.c:3: warning: array subscript is above array bounds
[js@HOST2 cpp]$

, Если бы это вместо этого отформатировало бы Ваш жесткий диск после наблюдения массива, получил доступ за пределы - который был бы законен для него - качество реализации будет довольно плохо. Я наслаждался для чтения о том материале в ANSI C документ Объяснения .

5
задан gerry3 19 November 2009 в 10:30
поделиться

1 ответ

Memory leaks are blocks of memory allocated by the OS for your program to use while it is running, but not correctly returned as not in use when the program has finished with them. So this memory is 'lost'. Your program isn't using it, but the system doesn't yet know that it is free for other use.

When your application finishes running, all of the memory allocated to it by the OS, will be returned for re-use. Which answers your question.

However, memory leaks are a significant bug. On a low-memory device, like an iPhone, the less memory you consume the better, you don't want to be leaking memory as you run. If the device runs low on memory, your application may be terminated or crash, unexpectedly.

16
ответ дан 18 December 2019 в 09:08
поделиться