Вы, очевидно, определили, что вы закончили с объектом, на который у вас есть указатель, и если этот объект был malloc
ed, вы хотите free
его.Это не звучит как необоснованная идея, но тот факт, что у вас есть указатель на объект, ничего не говорит вам о том, как был выделен этот объект (с malloc
, с new
, с new[]
, сстек, как разделяемая память, как отображенный в памяти файл, как пул памяти APR , использующий сборщик мусора Boehm-Demers-Weiser и т. д.), поэтому нет никакого способачтобы определить правильный способ освобождения объекта (или, если освобождение вообще необходимо; у вас может быть указатель на объект в стеке).Это ответ на ваш настоящий вопрос.
Но иногда лучше ответить на вопрос, который следовало бы задать.И этот вопрос звучит так: «Как я могу управлять памятью в C ++, если я не всегда могу сказать такие вещи, как« как был выделен этот объект и как он должен быть освобожден »?»Это сложный вопрос, и, хотя это нелегко, можно управлять памятью, если следовать нескольким политикам.Всякий раз, когда вы слышите, как люди жалуются на правильное соединение каждого malloc
с free
, каждого new
с delete
и каждого new[]
с delete[]
и т. Д., Вы знаете, что они делают свою жизнь труднее, чем это необходимо,не следуя дисциплинированному режиму управления памятью.
Я собираюсь предположить, что вы передаете указатели на функцию, и когда функция будет выполнена, вы хотите, чтобы она очищала указатели.Эта политика, как правило, невозможно получить право.Вместо этого я бы порекомендовал придерживаться политики, согласно которой (1) если функция получает указатель от кого-то другого, то ожидается, что «кто-то еще» очистит (в конце концов, «кто-то еще» знает, как была распределена память) и (2) если функция выделяет объект, то в документации этой функции будет указано, какой метод следует использовать для освобождения объекта.Во-вторых, я очень рекомендую умные указатели и похожие классы.
Совет Страуструпа :
Если я создаю 10 000 объектов и у меня есть указатели на них, мне нужноудалить эти 10 000 объектов, а не 9 999 и не 10 001.Я не знаю, как это сделать.Если мне придется обработать 10 000 объектов напрямую, я облажусь.... Итак, довольно давно я подумал: «Хорошо, но я могу правильно обрабатывать небольшое количество объектов».Если мне нужно иметь дело с сотней объектов, я могу быть уверен, что правильно обработал 100, а не 99. Если я могу получить число до 10 объектов, я начинаю чувствовать себя счастливым.Я знаю, как убедиться, что я правильно обработал 10, а не только 9. "
Например, вам нужен код, подобный следующему:
#include <cstdlib>
#include <iostream>
#include "boost/shared_ptr.hpp"
namespace {
// as a side note, there is no reason for this sample function to take int*s
// instead of ints; except that I need a simple function that uses pointers
int foo(int* bar, int* baz)
{
// note that since bar and baz come from outside the function, somebody
// else is responsible for cleaning them up
return *bar + *baz;
}
}
int main()
{
boost::shared_ptr<int> quux(new int(2));
// note, I would not recommend using malloc with shared_ptr in general
// because the syntax sucks and you have to initialize things yourself
boost::shared_ptr<int> quuz(reinterpret_cast<int*>(std::malloc(sizeof(int))), std::free);
*quuz = 3;
std::cout << foo(quux.get(), quuz.get()) << '\n';
}