小编Pat*_*oul的帖子

为什么'std :: make_shared'总是使用全局内存分配,即使类重载了new / delete运算符也是如此?

使用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行为? …

c++ make-shared c++11

4
推荐指数
2
解决办法
132
查看次数

标签 统计

c++ ×1

c++11 ×1

make-shared ×1