Как освободить память в этом случае?

0

У меня есть один класс A и одна функция func как func ниже

class A
{
   int m_memA;
 public:
   A(int x):m_memA(x){}   
   std::string GetString(); 
};

A* CreateA()
{
    return new A(5);
}

bool func(std::string* stringOut)
{
   A* obj_A = CreateA();                //memory allocated in heap
   *stringOut = obj_A->GetString(); 
   if(stringOut->empty())
       {return true;}
   return false;      
} 

int main()
{
    std::string str;
    if(func(&str))        //How to free memory here?    
    {
        //do something
    }
    return 0;
}

Как освободить память при вызове func?

Теги:
class
function
memory-leaks
memory-management

2 ответа

4
Лучший ответ

Я не вижу абсолютно никакой причины для всех динамических распределений, но вам нужно delete func A в func:

bool func(std::string* stringOut)
{
   A* obj_A = CreateA();                //memory allocated in heap
   *stringOut = obj_A->GetString();
   delete obj_A;                      // delete dynamically allocated object
   return stringOut->empty();    
}

Изменить Поскольку вы не можете изменить CreateA, вы можете по крайней мере сделать это исключение безопасным, используя интеллектуальный указатель, такой как std::unique_ptr или boost::scoped_ptr. Например:

bool func(std::string* stringOut)
{
   std::unique_ptr<A> obj_A(CreateA());
   *stringOut = obj_A->GetString();
   return stringOut->empty();    
}
  • 0
    CreateA (), класс A - это уже существующий код. Ничего не поделаешь. Фанк находится под моим контролем.
  • 1
    @ontherocks ОК. Использование умного указателя может быть лучшей альтернативой. Смотрите мое редактирование.
Показать ещё 4 комментария
0

Я бы предложил использовать шаблон проектирования RAII для ваших объектов. Это позволит избежать утечек данных. Он будет обрабатывать возвраты, вызванные исключением.

Вот лучший шаблон дизайна.

A CreateA() { return A(5); }

// RAII designed heap allocation
std::unique_ptr<A> CreateHeapA() { return std::unique_ptr<A>(new A(5)); }


bool func(std::string* stringOut)
{
   *stringOut = CreateA().GetString();        // A allocated on the stack
   //*stringOut = CreateHeapA()->GetString(); // A allocated on the heap
   return stringOut->empty();
} 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню