2014-02-19 31 views
0

我有一类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被称为?

回答

4

我看绝对没有理由对所有的动态分配,但你需要deleteAfunc

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();  
} 
+0

CreateA(),类A是预先存在的代码。对此无能为力。 func是在我的控制之下。 – ontherocks

+1

@ontherocks好的。使用智能指针可能是更好的选择。看我的编辑。 – juanchopanza

+0

所以在'* stringOut = obj_A-> GetString();'stringOut有返回字符串集(因为它被解除引用?)。所以删除obj_A后,不会导致无效指针。 – ontherocks

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(); 
}