Comments 13
Три вида утечек в памятиОбычно говорят «утечек памяти», без «в».
+5
N single-threaded workers = N однопоточных работников?
Переводчик точно в теме, о чём текст?
Переводчик точно в теме, о чём текст?
+3
И еще «дамп ядра», когда имеется в виду «core dump».
0
По первой утечке: можно ли освободить блок созданный malloc вне функции(возвращает указатель на него), где он бы создан? (Приходилось стлокнуться, когда надо было поправить чужой код.)
0
Можно, но осторожно :)
Вызов free должен быть в той же единице трансляции (по простому, cpp-файле), что и вызов malloc
Например, можно создать дополнительную функцию
Вызов free должен быть в той же единице трансляции (по простому, cpp-файле), что и вызов malloc
Например, можно создать дополнительную функцию
char * leak_memory() {
char *leaked = malloc(4096);
use_a_buffer(leaked);
return leaked;
}
void freeMemory(char *mem) {
free(mem);
}
0
Вызов free должен быть в той же единице трансляции (по простому, cpp-файле)Это ещё почему? Все obj-файлы линкуются с одним libc, и free из любой единицы трансляции вызовет тот же free.
+2
Это так в случае статической линковки. В случае же динамической — может не выполняться.
Потому переданный через границы DLL/SO указатель, надо освобождать функцией из этой же DLL
Потому переданный через границы DLL/SO указатель, надо освобождать функцией из этой же DLL
0
Да, возможно я погорячился насчет той же единицы трансляции. Скорее тут стоило бы сказать «в той же DLL». Но от моего совета вряд ли будет хуже
+1
Можно уточнить до «того же экземпляра рантайма». Потому как если все DLL динамически слинкованы с некоей msvcrt.dll, то тоже можно выделять память в одной DLL и освобождать в другой. В Delphi для этого есть packages.
Но от моего совета вряд ли будет хужеСоздание мифов — да, безобидное дело )))
0
В продолжение темы утечки типа 3: sourceware.org/bugzilla/show_bug.cgi?id=14827.
В Glibc, при free участка памяти размером меньше M_MXFAST (константа времени компиляции), освобожденный участок не возвращается в пользование ОС. Пока malloc_trim не вызовешь, все эти кусочки, сколько бы их ни было, «занимают место»…
До того, как я встретил это при работе с большой таблицей в Pandas (Python), к своему стыду, не задумывался, что «free dynamic memory» не включает, вообще говоря, «release free memory».
Вообще, ненастраиваемость этой и связанных констант, а также ее дефолтное значение, считал неправильностью (особенно понимая, что это может быть причиной «у меня течет KDE/Chrome/etc. ну и, точно, моего кода на Pandas), но, благо, мне объяснили, что никто (free) в этом мире ничего никому не должен.
В одном из других аллокаторов, кажется, трима вообще не происходит без особых условий…
В Glibc, при free участка памяти размером меньше M_MXFAST (константа времени компиляции), освобожденный участок не возвращается в пользование ОС. Пока malloc_trim не вызовешь, все эти кусочки, сколько бы их ни было, «занимают место»…
До того, как я встретил это при работе с большой таблицей в Pandas (Python), к своему стыду, не задумывался, что «free dynamic memory» не включает, вообще говоря, «release free memory».
Вообще, ненастраиваемость этой и связанных констант, а также ее дефолтное значение, считал неправильностью (особенно понимая, что это может быть причиной «у меня течет KDE/Chrome/etc. ну и, точно, моего кода на Pandas), но, благо, мне объяснили, что никто (free) в этом мире ничего никому не должен.
В одном из других аллокаторов, кажется, трима вообще не происходит без особых условий…
0
Sign up to leave a comment.
Три вида утечек памяти