Weird alloc на очень простой код C ++ [дубликат]

Это может быть ссылка на компонент из интерфейса Xib, который вы переименовали или удалили. Для меня работает референция.

59
задан sudo make install 22 May 2015 в 17:26
поделиться

3 ответа

Это ошибка Вальгринда. Во-первых, -fsanitize=leak ничего не показывает. Во-вторых, сам Valgrind утверждает , что:

Прежде всего: расслабьтесь, это, вероятно, не ошибка, а функция. Многие реализации стандартных библиотек C ++ используют свои собственные распределители пула памяти. Память для целого ряда разрушенных объектов не сразу освобождается и возвращается обратно в ОС, а хранится в пулах (-ях) для последующего повторного использования. Тот факт, что пулы не освобождаются при выходе из программы, заставляет Valgrind сообщать об этой памяти по-прежнему доступной. Поведение не для свободных пулов на выходе может быть названо ошибкой библиотеки.

Используя GCC, вы можете заставить STL использовать malloc и освободить память как можно скорее, глобально отключив кеширование памяти , Осторожно! Это может замедлить вашу программу, иногда резко.

С GCC 2.91, 2.95, 3.0 и 3.1 скомпилируйте весь источник, используя STL с -D__USE_MALLOC. Осторожно! Это было удалено из GCC, начиная с версии 3.3.

С GCC 3.2.2 и более поздними версиями вы должны экспортировать переменную среды GLIBCPP_FORCE_NEW перед запуском вашей программы.

С GCC 3.4 и более поздними версиями, эта переменная изменила имя на GLIBCXX_FORCE_NEW.

[...]

Я предполагаю, что предполагаемые пулы памяти освобождены после завершения программы в так называемом стартовом коде, который вызывает main среди других настроек. Внутренние функции, определенные вне кода пользователя, должны обрабатываться так, как если бы они не существовали, поэтому Valgrind не может (и не должен) видеть дополнительные освобождения.

46
ответ дан edmz 22 August 2018 в 00:45
поделиться

Рассмотрим следующий тривиальный файл include:

#ifndef TRIVIAL_INCLUDE_FILE
#define TRIVIAL_INCLUDE_FILE
static int *x = new x (0);
#endif
5
ответ дан David Schwartz 22 August 2018 в 00:45
поделиться
  • 1
    Как это помогает? – bcumming 4 August 2015 в 11:46
  • 2
    К сожалению, вопрос был строго отредактирован из формы, на которую я ответил. Первоначальный вопрос: « Я просто хотел бы понять, как просто включение стандартного заголовка библиотеки может вызвать предупреждение о доступности, когда ни один из объектов из этой библиотеки не был выделен в самой программе. & Quot; Код примера отвечает на этот вопрос. – David Schwartz 4 August 2015 в 16:43
  • 3
    Ах, это имеет смысл. К сожалению, я смог воспроизвести ту же самую проблему без включения заголовков. – bcumming 4 August 2015 в 17:26

Для gcc 6 и выше произошло связанное исправление ошибок:

С помощью gcc 5 вы также можете получить такое же предупреждение, не включая iostream.

Итак, если вы видите аналогичное предупреждение, относящееся к dl-init.c, и вы используете gcc 5, рассмотрите обновление до более новой версии (gcc> = 6) или попытайтесь скомпилировать с clang.

3
ответ дан Philipp Claßen 22 August 2018 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: