вернуть указатель на данные, объявленные в функции - PullRequest
9 голосов
/ 23 февраля 2010

Я знаю, что это не сработает, потому что переменная x уничтожается, когда функция возвращает:

int* myFunction()
{
    int x = 4; return &x;
}

так как мне правильно вернуть указатель на что-то, что я создаю в функции, и с чем мне нужно позаботиться? Как избежать утечек памяти?

Я также использовал malloc:

int* myFunction2()
{
    int* x = (int*)malloc(sizeof int); *x = 4; return x;
}

Как вы правильно это делаете - в C и C ++?

Ответы [ 11 ]

0 голосов
/ 23 февраля 2010

Повышение или общие указатели TR1 - это, как правило, путь. Это позволяет избежать накладных расходов на копирование и дает вам полуавтоматическое удаление. Итак, ваша функция должна выглядеть так:

boost::shared_ptr<int> myFunction2()
{
    boost::shared_ptr<int> x = new int; 

    *x = 4; 
    return x;
}

Другой вариант - просто разрешить копирование. Это не так уж плохо, если объект маленький (например, этот) или вы можете создать объект в операторе return. Компилятор обычно оптимизирует удаление копии, если объект создан в операторе возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...