Skip to main content

std::unique_ptr<T,Deleter>::release

Since C++11
pointer release() noexcept; 
Since C++23
constexpr pointer release() noexcept;

Releases the ownership of the managed object, if any.

get() returns nullptr after the call.

The caller is responsible for deleting the object.

Parameters

(none)

Return value

Pointer to the managed object or nullptr if there was no managed object, i.e. the value which would be returned by get() before the call.

Example

#include <memory>
#include <iostream>
#include <cassert>

struct Foo {
Foo() { std::cout << "Foo\n"; }
~Foo() { std::cout << "~Foo\n"; }
};

int main()
{
std::cout
<< "Creating new Foo...\n";
std::unique_ptr<Foo> up(new Foo());

std::cout
<< "About to release Foo...\n";
Foo* fp = up.release();

assert (up.get() == nullptr);
assert (up == nullptr);

std::cout
<< "Foo is no longer owned by unique_ptr...\n";

delete fp;
}

Result
Creating new Foo...
Foo
About to release Foo...
Foo is no longer owned by unique_ptr...
~Foo

std::unique_ptr<T,Deleter>::release

Since C++11
pointer release() noexcept; 
Since C++23
constexpr pointer release() noexcept;

Releases the ownership of the managed object, if any.

get() returns nullptr after the call.

The caller is responsible for deleting the object.

Parameters

(none)

Return value

Pointer to the managed object or nullptr if there was no managed object, i.e. the value which would be returned by get() before the call.

Example

#include <memory>
#include <iostream>
#include <cassert>

struct Foo {
Foo() { std::cout << "Foo\n"; }
~Foo() { std::cout << "~Foo\n"; }
};

int main()
{
std::cout
<< "Creating new Foo...\n";
std::unique_ptr<Foo> up(new Foo());

std::cout
<< "About to release Foo...\n";
Foo* fp = up.release();

assert (up.get() == nullptr);
assert (up == nullptr);

std::cout
<< "Foo is no longer owned by unique_ptr...\n";

delete fp;
}

Result
Creating new Foo...
Foo
About to release Foo...
Foo is no longer owned by unique_ptr...
~Foo