C++ код
int* func(int* a){
int* result=(int*)malloc(sizeof(int)*200);
… … …
return result;
}
все как бы работает, но нужно ли очищать память для переменной result, и как это сделать?
просто функция эта вызывается из рекурсии много раз, и много памяти занимает программа. думаю что из за этой функции
[Добавлено модератором]
См. #24
26 марта 2010 в 9:00
Проблема навряд-ли решена. Нарушено RAII, и я уверен – нарушено и при выделении и памяти вначале. Надо очень сильно (!) бить по рукам "программистов", которые нарушают RAII в С++ – таким программистам не следует переходить на данный ЯВУ.
Медвед, Вам уже и в #6, и позже намекнули на способ решения проблемы – auto_ptr… Вы как-то его проигнорировали?
Для массива надо использовать Буст – shared_ptr со своим делетером или shared_array. Эти умные указатели также реализуют паттерн подсчёта ссылок (без учёта зацикливаний), что позволяет писать как в Java.
Пример:
typedef std:auto_ptr<CKlass> tKlass;
…
{
tKlass pInst = new CKlass(); // pInst – ссылка на объект
…
pInst_>CallMethod();
…
} // Объект будет автоматически уничтожен при выходе за область видимости
Пример с массивом:
typedef boostd:shared_array<int> aInt;
…
aInt pData = new int[200]; // pData – ссылка на массив
…
pData[5] = …;
…
// Массив будет уничтожен по уничтожению всех ссылок
P.S. Чтобы не тащить весь Буст, можно использовать только заголовочные файлы (для смартпоинтеров это работает) или написать свой вариант умных указателей (там немного писать).
P.P.S В случае выделения памяти "вначале" надо использовать или shared_array, или сделать объект wrapper для массива и использовать auto_ptr (во враппере перегрузить оператор []) – хотя и обращение будет несколько неудобным по сравнению с shared_array, можно обойтись без Буста; но, вообще, с точки зрения ООП, прямого доступа к массиву быть не должно, и если правильно провести декомпозицию, тут не потребуется вообще никаких умных указателей – будет простая статическая структура, и указанных Вами пробелм просто не возникнет… Но это уже задача не программиста, а архитектора.
25 марта 2010 в 12:01
решил проблему, выделив память в начале
24 марта 2010 в 22:04
>> Вроде числа Фибоначчи )))
омфг.
24 марта 2010 в 16:02
дмитрий, через template опять же ограничение максимальный размер int
24 марта 2010 в 16:01
template <int N>
struct Fib {
static const int result =Fib<N-1>::result + Fib<N-2>::result;
};
template <>
struct Fib<1> {static const int result = 1;}
template <>
struct Fib<0> {static const int result = 1;}
Вроде числа Фибоначчи )))
24 марта 2010 в 16:01
сейчас попробую в начале выделить)
24 марта 2010 в 16:00
Если твоя функция используется только внути модуля. то можно как в #3
24 марта 2010 в 16:00
(int*)malloc(sizeof(int)*200) – это ЗЛО в C++. Это чудо использовать просто нельзя
int *p = new int[200]; // и проще и нагляднее и правильно!
24 марта 2010 в 16:00
задание вообще, посчитать числа фибоначчи рекурсией
24 марта 2010 в 16:00
Это для очень больших чисел?
24 марта 2010 в 16:00
Уже достаточно на старте выделить 2 массива ))) и более не выделять память вообще
24 марта 2010 в 15:05
подскажите как? я ни разу не использовал vector
24 марта 2010 в 15:05
Вот пример:
если есть такая функция, как fopen(), которая возвращает FILE *,
то удаление выделенной памяти осуществляет не тот, кто использует функцию, а тот, кто написал fopen(), т.е. это происходит в функции fclose()
24 марта 2010 в 15:05
FILE *f = fopen();
….
fclose(f);
Выделение и удаление памяти происходит внутри библиотеки, реализующей работу с файлами на C
24 марта 2010 в 15:05
это понятно
но вот к моему примеру? как очистить память за func, после ее использования?
или как ее нужно выделить чтобы можно было очистить?
24 марта 2010 в 15:05
А что за задача то такая срекурсией?
24 марта 2010 в 15:04
int *p = func(..);
… use p …
free(p);
24 марта 2010 в 15:04
добавь в конце free(result);
24 марта 2010 в 15:04
в конце? после return ? а разве код после ретурна выполняется?
24 марта 2010 в 15:04
Ужас! работа с памятью на разных логических уровнях – это ооочень дурной стиль.
хотя бы auto_ptr заиспользовал бы
24 марта 2010 в 15:04
в каком смысле на разных логических уровнях?
24 марта 2010 в 15:04
Раз уж C++, а не C, то лучше использовать какой-нибудь класс для управления памятью, хотя бы vector из STL.
24 марта 2010 в 15:03
1. освобождать память нужно
2. видимо это должен делать сторонний код, который вызывает функцию.
int* p;
func(p);
free(p);
это аналогично всяким strdup и т.п.
только надо еще быть уверенным, чтобы никто не вызвал delete p)
не понимаю, почему вы не используете new
3. в случае рекурсии этот код грозит занять много памяти, я бы искал другие решения..либо другую организацию программы. к тому же, как известно, любую рекурсию можно превратить в итерацию..