使用std::make_shared<C>该类时,不会调用重载的new / delete运算符。
使用时std::shared_ptr<C>,std::unique_ptr<C>与std::make_unique<C>类超载新/使用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>();
Run Code Online (Sandbox Code Playgroud)
从外部的角度来看,它似乎不一致且容易出错。应该始终使用重载类new / delete运算符。
那么,这种行为的原理是什么?
而且,C ++规范在哪里详细说明了std::make_shared行为? …