我试图了解 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/