在这种情况下如何释放内存?

时间:2014-02-19 19:22:13

标签: c++ function class memory-management memory-leaks

我有一个A类和一个函数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时释放内存?

2 个答案:

答案 0 :(得分:4)

我完全没有理由进行所有动态分配,但您需要delete 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_ptrboost::scoped_ptr)使此例外安全。例如:

bool func(std::string* stringOut)
{
   std::unique_ptr<A> obj_A(CreateA());
   *stringOut = obj_A->GetString();
   return stringOut->empty();    
}

答案 1 :(得分: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();
}