Проверка, если что-то было malloced

После шага nest мы можем просмотреть «данные» list в mutate, используя map, затем выполнить group_by и summarise с ним

library(tidyverse)
NBA%>%
  group_by(season)%>%
  nest() %>%
  mutate(data = map(data, ~ .x %>%
        group_by(player)%>%
        summarise(shots_attempts_ratio=sum(shot_made)/n(),
        total_attempts=n(),
        shots=sum(shot_made))
        )) %>%
 unnest
8
задан Aditya Mukherji 9 November 2008 в 22:48
поделиться

8 ответов

Заключение в кавычки из комментария:

Я делаю метод, который в основном избавится от структуры. это имеет элемент данных, который является указателем на что-то, что может или не может быть malloced.. в зависимости от которого, я хотел бы освободить его

Корректный путь состоит в том, чтобы добавить другого участника к структуре: указатель на функцию освобождения.

Это не просто статично по сравнению с динамическим выделением. Существует несколько возможных средств выделения, который malloc() всего один.

В подобных Unix системах это могло быть:

  • Статическая переменная
  • На стеке
  • На стеке, но динамично выделенный (т.е. alloca())
  • На "куче", выделенной с malloc()
  • На "куче", выделенной с new
  • На "куче", посреди массива, выделенного с new[]
  • На "куче", в структуре, выделенной с malloc()
  • На "куче", в базовом классе объекта, выделенного с new
  • Выделенный с mmap
  • Выделенный с пользовательским средством выделения
  • Намного больше опций, включая несколько комбинаций и изменений вышеупомянутого

В Windows у Вас также есть несколько времени выполнения, LocalAlloc, GlobalAlloc, HeapAlloc (с несколькими "кучей", которую можно создать легко), и так далее.

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

Можно также избежать целого выпуска или требованием, чтобы указатель всегда был выделен с определенным средством выделения или путем обеспечения средства выделения сами (в форме функции для выделения памяти и возможно функции для выпуска его). При обеспечении средства выделения сами можно даже использовать приемы (как теговые указатели), чтобы позволить тому также использовать статическое выделение (но я не буду вдаваться в подробности этого подхода здесь).

У Raymond Chen есть сообщение в блоге об этом (Центральный Windows, но понятия являются тем же везде): Выделение и освобождение памяти через границы модуля

11
ответ дан 5 December 2019 в 10:44
поделиться

Библиотека ACE делает это повсеместно. Вы можете проверять, как они делают это. В целом Вы, вероятно, не должны должны быть делать это во-первых хотя...

2
ответ дан 5 December 2019 в 10:44
поделиться

Начиная с "кучи" стек и статическая область данных обычно занимают различные диапазоны памяти, возможно с глубокими знаниями карты распределения памяти процесса, посмотреть на адрес и определить, в какой области выделения это находится. Эта техника является и архитектурой и конкретным компилятором, таким образом, это делает портирование Вашего кода более трудным.

2
ответ дан 5 December 2019 в 10:44
поделиться

Можно ли сцепиться в malloc () сам, как malloc отладчики делают, с помощью LD_PRELOAD или чего-то? Если так, Вы могли сохранить таблицу всех выделенных указателей и использования этим. Иначе я не уверен. Существует ли способ достигнуть бухгалтерскую информацию malloc?

0
ответ дан 5 December 2019 в 10:44
поделиться

Большинство libc malloc реализации работает путем хранения заголовка перед каждым возвращенным блоком памяти, который имеет поля (чтобы использоваться свободным () вызов), который имеет информацию о размере блока, а также 'волшебное' значение. Это волшебное значение должно защитить от пользователя, случайно удаляющего указатель, который не был alloc'd (или освобождение блока, который был перезаписан пользователем). Это - очень система, конкретная, таким образом, необходимо было бы посмотреть на реализацию libc библиотеки для наблюдения точно, чем волшебное значение было там.

После того как Вы знаете, что, кладете обратно данную подсказку, чтобы указать на заголовок и затем проверить его на волшебное значение.

2
ответ дан 5 December 2019 в 10:44
поделиться

Не как стандартная функция.
Отладочная версия Вашей malloc библиотеки могла бы иметь некоторую функцию, чтобы сделать это.

0
ответ дан 5 December 2019 в 10:44
поделиться

Можно сравнить его адрес с чем-то, что Вы знаете, чтобы быть статичными, и сказать, что это - malloced, только если это далеко, если Вы знаете объем, это должно прибывать из, но если его объем неизвестен, Вы не можете действительно доверять этому.

0
ответ дан 5 December 2019 в 10:44
поделиться

1.) Получите файл карты для кода, который Вы имеете.

2.) Базовая целевая платформа процесса/аппаратных средств должна иметь файл карты распределения памяти, который обычно указывает - начальный адрес памяти (стек, "куча", global0, размер того блока, атрибуты чтения-записи того блока памяти.

3.) После получения адреса объекта (переменная указателя) из mao файла в 1.) пытаются видеть, в какой блок тот адрес падает. u мог бы получить некоторое представление.

=AD

-1
ответ дан 5 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

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