std::make_shared shall be used to construct objects owned by std::shared_ptr
std::make_shared shall be used to construct objects owned by std::shared_ptr.
Instead of allocating memory by using the new operator and converting
the resulting raw pointer to an std::shared_ptr object, for
instance:
class numberClass {
public:
numberClass(int n): number(n){}
private:
int number;
}
int aNumber=1;
std::shared_ptr<numberClass> numberPtr (new numberClass(aNumber)); std::shared_ptr object directly using the use
std::make_shared function. For
instance:auto numberPtr = std::make_shared<numberClass>(aNumber);
Using std::make_shared is preferred because:
The creation of the std::shared_ptr object is performed in a
single dynamic memory allocation and improves run-time performance. Otherwise,
creating a raw pointer by using the new operator requires one
dynamic memory allocation and converting the raw pointer to an
std::shared_ptr object requires a second allocation. The second
allocation creates a control block that keeps track of the reference count of the
shared resource and makes the std::shared_ptr object aware of all
pointers to the shared resource.
The creation of the std::shared_ptr object using
std::make_shared is exception-safe. Otherwise, an exception can
occur between the dynamic memory allocation with the new operator
and the subsequent conversion, leading to a memory leak. An exception causes a memory
leak only in certain contexts, for instance, when the
std::shared_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.
The checker flags the creation of an std::shared_ptr object (or
boost::shared_ptr object) from the raw pointer returned by the
new operator.
If you expect a rule violation but do not see it, refer to the documentation for Polyspace® Bug Finder™ or Polyspace Bug Finder Server™.
| Group: General utilities library |
| Category: Required, Automated |