Returning a unique_ptr
from a function is a common and recommended practice when you want to transfer ownership of dynamically allocated objects without the risk of memory leaks. Here is how you can return a unique_ptr
from a function in C++.
Returning a unique_ptr Directly
C++ supports Return Value Optimization (RVO) and move semantics, which means you can return a unique_ptr
from a function without worrying about copying the pointer or the managed object. Here’s an example:
#include <iostream> #include <memory> std::unique_ptr<int> GetData1(int value) { std::unique_ptr<int> ptr = std::make_unique<int>(value); // unique_ptr is moved from here return ptr; } std::unique_ptr<int> GetData2(int value) { return std::make_unique<int>(value); } int main() { std::unique_ptr<int> uniquePtr1 = GetData1(42); std::unique_ptr<int> uniquePtr2 = GetData2(42); // Do some work here return 0; }
In the example above, GetData1()
&GetData2()
functions creates a unique_ptr
object that manages an dynamic memeory allocated on heap to store the given integer value and this function returns that unique_ptr
object. The returned unique_ptr
is moved into uniquePtr
object.
We can not opy a unique_ptr object, but the above code will work, due to move semantics. When the unique_ptr
object is returned from the function, it is either moved (if move elision is not applicable) or constructed directly in the return location (thanks to RVO) without any copying involved. Therefore, the unique ownership of the managed object remains intact, and there is no risk of accidentally copying and breaking the unique ownership rule.
Summary
We can safely return a unique_ptr
from a function without any special syntax or worry. The C++ language guarantees that this will not violate the uniqueness of the unique_ptr
, ensuring safe memory management and avoiding leaks. Always remember to use std::make_unique
when possible to create the unique_ptr
for added safety and clarity.