Как правильно освободить память после calloc()

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 28 авг 2014.

  1. AlexVS

    AlexVS Гик

    Написал (используя пример) функцию возвращающую значение, в ней использована calloc().
    Если вызывать free() до выхода из функции, то теряется значение.
    А как вызвать free() после выхода из функции, если result - это локальная переменная?
    Код (Text):
    char* ValSerch(byte s,byte l)
    {
    ....................................
        char* result = (char*)calloc(length+1, sizeof(char));
        strncpy(result, fQute, length);
        return result;
    }
    Вызов делаю так

    Код (Text):
     int H = atol(ValSerch('"',8));
     
    Последнее редактирование: 28 авг 2014
  2. geher

    geher Гуру

    Если вызвать функцию так:
    char* r =ValSerch(s, l);
    то память можно освободить вызовом
    free(r);
    Функции free требуется адрес, а не конкретная переменная.

    Но это "некрасиво", поскольку теоретически (не в скетче ардуино) возможны ситуации, когда это не сработает.
     
  3. AlexVS

    AlexVS Гик

    Спасибо. Так и сделал.
     
  4. Вообще-то для этого классы придуманы, как-то так:

    class ValSerch {
    public:
    ValSerch( byte s, byte l) { ...; p = (char*)calloc(length+1, sizeof(char)); ...}
    ~ValSerch() { if( p) free(p) }
    inline char *ptr() { return p; }
    private:
    char *p;
    };