У меня есть один класс 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
?
Я не вижу абсолютно никакой причины для всех динамических распределений, но вам нужно 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();
}
Я бы предложил использовать шаблон проектирования 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();
}