c++ - 重载一个新的运算符——这段代码不应该产生错误吗

标签 c++ c++11

我试图了解 operator new 是如何被重载的,并从我在网上进行的研究中得到了这一点。 新的运算符重载函数采用 size_t 类型。但是在我的 main 中,我使用 new Dummy() 调用它。根据我的理解,Dummy 被隐式转换为 size_t 正确吗?那么 () 在 Dummy 之后会发生什么?这不应该导致错误吗?

void* operator new(size_t sz)
{
  void* m = malloc(sz);
  std::cout<<"User Defined :: Operator new"<<std::endl;

  return m;
}

class Dummy
{
public:
  Dummy()
  {
    std::cout<<"Dummy :: Constructor"<<std::endl;
  }
  ~Dummy()
  {
    std::cout<<"Dummy :: Destructor"<<std::endl;
  }
};


int main()
{
    Dummy * dummyPtr = new Dummy();
}

最佳答案

new 关键字涉及两件事:

首先,您拥有 new 运算符,标准定义了不同的重载,您可以覆盖它们或创建新的。它的职责是分配 N 大小的内存并返回一个 void* 给它。您甚至可以创建自己的 new 运算符来分配内存并获取额外的参数,如下所示:

void* operator new(size_t sz, char x) // x is a placement param
{
    std::cout << "User Defined :: Operator new" << std::endl;
    return ::operator new(sz); // standard new
}

auto* x = new('*') int(234); // our overload

但是等一下,new操作符是怎么得到我们要实例化的类型的大小的??

我们的 friend new expression 刚进入游戏!

将 new 表达式想象成一些用于调用 new 运算符的语法糖。它有这样的结构:

new(placement_params) type+initializer

这意味着对于 new int(22) 表达式将是 new(no placements) int + copy_initializer(22) 并且它将在内部调用 新运算符 传递类型的大小。

New 运算符将返回指向它刚刚分配的内存的 void*new expression 的正确大小将初始化该内存。在这个例子中调用复制初始值设定项

关于c++ - 重载一个新的运算符——这段代码不应该产生错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48756746/

相关文章:

c++ - MySQL C++ 连接器 : SIGABRT Connecting to Database

c++ - 调试时检查 map 的内容

c++在参数中转发命名空间声明

c++ - 在字符串 vector 中搜索匹配时出现 std::out_of_range 异常

c++ - 我可以使用 std::shared_ptr 而不是 boost::shared_ptr 构建 boost 库吗

c++ - 将 std::string 写入可比较的 *time* 解析器,这可能会失败

c++11 initializer_list 不适用于嵌入对象的文字常量值?

c++ - 初始化动态字符串数组 (C++)

c++ - 多态仿函数上的 std::result_of

c++ - 将 make_shared 与 emplace_back 和 push_back 一起使用 - 有什么区别吗?