Цитата из вашего комментария:
я создаю метод, который в основном избавится от структуры. у него есть элемент данных, который является указателем на что-то, что может или не может быть неправильно распределено .. в зависимости от того, какой из них я бы хотел освободить
Правильный способ - добавить еще один член в структуру: указатель на функцию освобождения.
Это не просто статическое или динамическое распределение. Существует несколько возможных распределителей, из которых malloc()
- это только один.
В Unix-подобных системах это может быть:
- Статическая переменная
- в стеке
- В стеке, но динамически распределяется (т. Е.
alloca()
)
- На куче, выделенной с
malloc()
- В куче, выделенной с
new
- В куче, в середине массива, выделенного с
new[]
- В куче, внутри структуры, выделенной с
malloc()
- В куче, внутри базового класса объекта, выделенного с
new
- Выделено с
mmap
- Выделено с помощью пользовательского распределителя
- Множество других опций, включая несколько комбинаций и вариантов вышеупомянутых
В Windows у вас также есть несколько сред выполнения, LocalAlloc
, GlobalAlloc
, HeapAlloc
(с несколькими кучами, которые вы можете легко создать) и т. Д.
Вы должны всегда освобождать память с правильной функцией освобождения для используемого вами распределителя. Таким образом, либо часть программы, ответственная за выделение памяти, также должна освободить память, либо вы должны передать правильную функцию освобождения (или обертку вокруг нее) в код, который освободит память.
Вы также можете избежать всей проблемы, требуя, чтобы указатель всегда выделялся с определенным распределителем, или предоставляя распределитель самостоятельно (в форме функции для выделения памяти и, возможно, функции для ее освобождения). Если вы предоставляете распределитель самостоятельно, вы можете даже использовать приемы (например, теговые указатели), чтобы разрешить также использовать статическое распределение (но я не буду вдаваться в подробности этого подхода здесь).
Раймонд Чен имеет сообщение в блоге (ориентированное на Windows, но концепции везде одинаковы): Распределение и освобождение памяти через границы модуля