AUTOSAR C++14 Rule A20-8-5
std::make_unique shall be used to construct objects owned by std::unique_ptr
Since R2020b
Description
Rule Definition
std::make_unique shall be used to construct objects owned by std::unique_ptr.
Rationale
Instead of allocating memory by using the new
operator and converting
the resulting raw pointer to an std::unique_ptr
object, for
instance:
class numberClass { public: numberClass(int n): number(n){} private: int number; } int aNumber=1; std::unique_ptr<numberClass> numberPtr (new numberClass(aNumber));
std::unique_ptr
object directly using the
std::make_unique
function. For
instance:auto numberPtr = std::make_unique<numberClass>(aNumber);
Using std::make_unique
is preferred because:
The creation of the
std::unique_ptr
object usingstd::make_unique
is exception-safe. Otherwise, an exception can occur between the dynamic memory allocation with thenew
operator and the subsequent conversion, leading to a memory leak. An exception causes a memory leak only in certain contexts, for instance, when thestd::unique_ptr
object is created in an argument of a multi-parameter function and another function argument evaluation throws an exception.You can use a more concise syntax. You do not have to repeat the data type of the object that is dynamically allocated.
Polyspace Implementation
The checker flags the creation of an std::unique_ptr
object (or
boost::unique_ptr
object) from the raw pointer returned by the
new
operator.
Troubleshooting
If you expect a rule violation but Polyspace® does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.
Examples
Check Information
Group: General utilities library |
Category: Required, Automated |