“新运营商”和“运营商新”之间的区别?

“新运营商”和“运营商新”有什么区别?

我通常试图以不同的方式来区分这两者,但是无论如何这都是一个很好的问题。

operator new是一个分配原始内存的函数 – 至less从概念上讲,与malloc()没有什么不同。 虽然这很不寻常,除非你自己写容器,你可以直接调用operator new,比如:

 char *x = static_cast<char *>(operator new(100)); 

也可以在全局或特定的类中重载运算符new。 IIRC,签名是:

 void *operator new(size_t); 

当然,如果你重载一个operator new(global或者是一个类),你也需要重载匹配的operator delete。 对于它的价值,还有一个单独的运算符new [],用于为数组分配内存 – 但是你几乎肯定会忽略完全的混乱。

新的操作符是您通常用来从免费商店创build对象的东西:

 my_class *x = new my_class(0); 

两者的区别在于operator new 分配原始内存,没有别的。 新运算符通过使用operator new来分配内存,然后调用正确types的对象的构造函数,所以结果是在该内存中创build的真实活动对象。 如果该对象包含任何其他对象(embedded的或作为基类),那么这些构造器也将被调用。

“运营商新”

 class Foo { public: void* operator new( size_t ); } 

“新运营商”:

 Foo* foo = new Foo(); 

在这个例子中, new Foo()调用Foo::operator new()

换句话说,“new operator”就像+运算符调用operator +()一样调用operator new() operator +()

以下是来自Scott Meyers的更有效的C ++书籍的引用:

新运算符调用一个函数来执行必要的内存分配,并且可以重写或重载该函数以更改其行为。 新运算符调用分配内存的函数的名称是operator new。

“新运营商”和“新运营商”没有区别。 两者都引用同样的事情:可重载/可replace的operator new函数通常为由new-expressions创build的对象执行原始内存分配。

还要注意,这两个术语都不存在于语言规范中(这是官方术语的定义来源)。

当你在你的程序中使用new来创build一个对象时,它被称为new-expressionNew-expression由关键字new和由语法定义的附加语法部分组成。 这个expression式的语法没有任何部分被称为“运算符”。

原始的内存分配functionoperator new正式被称为“ operator new function”。 请注意,在这个序列中的operatornew词只是两个单独的C ++语言关键字。 他们没有形成一个英文术语“运营商新”。 在语言规范中没有任何地方可以find对“operator new”作为英文术语的引用。 每次这只是两个独立关键字的组合,这些关键字为内存分配函数生成声明语法。

同样,在简历中:正式使用C ++,没有像“operator new”或“new operator”这样的英语术语。 前面的序列在语言规范中仅仅是关键字的组合,而不是英语术语。 后者根本不存在。

当你创build一个新的对象时,内存使用operator new进行分配,然后调用构造函数来初始化内存。 新运营商既进行分配又进行初始化,新运营商只进行分配。

OP的问题没有妥当。 “运营商新”和“新expression”之间的区别是否更好? 注意'operator new'也经常指'operator new function'。

周围有很多正确的答案,下面是我的:

1>'new expression'调用'operator new'来分配原始内存,然后调用构造函数

 apple * p = new apple(); //new expression 

2>'operator new'只分配原始内存,与malloc差别不大

 void* mem = operator new(sizeof(apple)); //just like calling malloc() apple* p2 = new(mem) apple(1); //call construct here using placement new. 

新运算符 :C ++支持使用new运算符dynamic分配对象。 新运算符为一个名为free store的池中的对象分配内存。 新运算符将调用新的特殊函数运算符。

operator new :如果请求是零字节的存储,operator new返回一个指向不同对象的指针(也就是说,重复调用operator new返回不同的指针)。 如果分配请求的内存不足,operator new返回NULL或抛出exception。 operator new的第一个参数必须是size_t(在STDDEF.H中定义的types),返回types总是void *。

这是一个MSDN链接的更多细节:

运营商新function

新的运营商

  1. new是一个运算符,也是一个关键字。

    见[1] 2.13 && 2.12。

  2. 做两件事:T * t = new T(arg);

    1)为对象分配内存:void * ptr = operator new (sizeof(T));

    new new是一个函数(就像c中的malloc一样),而不是一个运算符(参见[3.7.4])。 但是第7项[2]也表示它也是一个运营商。 在我看来,运算符和函数之间的差别很小,当你记得重载运算符是由函数实现时,你可以看到它。

    //我们可以重载这个运算符/函数(运算符new),只是在这里做我们想要的。

    2)初始化分配内存中的对象:在ptr上调用T :: T(arg)

    // 只有编译器可以做到这一点。 我也不能。

    //编译器也会调用成员对象的构造函数和基类的构造函数,如果T有它们的话。 这个调用是recursion的。 只有编译器能做到这一点。

  3. 所以,新运营商做了新的任务的一部分,只有在这个部分我们才能做点事情。

    [1]:ISO / IEC,N3690。 http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [2]:迈尔斯,斯科特。 有效的C ++,第3版。