我有一个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
时释放内存?
答案 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_ptr
或boost::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();
}