При использовании std::make_shared<C>
перегруженные операторы new/delete класса не вызываются.
При использовании std::shared_ptr<C>
, std::unique_ptr<C>
и std::make_unique<C>
используются перегруженные операторы new/delete класса.
Если посмотреть на документацию, это совершенно правильно и хорошо документировано.
cppreference объясняет поведение:
std::make_shared
использует ::new, поэтому, если какое-либо специальное поведение было настроено с использованием специфичного для класса оператора new, оно будет отличаться отstd::shared_ptr<T>(new T(args...))
.
Ниже приведен некоторый псевдокод, чтобы лучше выделить поведение:
#include <memory>
class C {
public:
void* operator new(size_t size) {
void* p = ::operator new(size);
std::cout << "C::new() -> " << p << "\n";
return p;
}
void operator delete(void* p) {
std::cout << "C::delete() -> " << p << "\n";
::operator delete(p);
}
};
std::shared_ptr<C> ptr = std::make_shared<C>();
С внешней точки зрения это кажется непоследовательным и подверженным ошибкам. Всегда следует использовать операторы new/delete класса перегрузки.
Итак, в чем причина такого поведения?
И где спецификация C++ с подробным описанием поведения std::make_shared
?
Спасибо за вашу помощь.
std::allocate_shared
для этого - person Cory Kramer   schedule 13.09.2019