“new operator”和“operator new”有什么区别?
答案 0 :(得分:112)
我通常会尝试用不同的方式来区分两者,以便更好地区分两者,但无论如何这都是一个很好的问题。
operator new是一个分配原始内存的函数 - 至少从概念上讲,它与malloc()
没有多大区别。虽然这是非常不寻常的,除非您正在编写类似于您自己的容器,您可以直接调用operator new,例如:
char *x = static_cast<char *>(operator new(100));
也可以在全局或特定类中重载operator new。 IIRC,签名是:
void *operator new(size_t);
当然,如果重载运算符new(全局或类),您还需要/也需要重载匹配的运算符delete。对于它的价值,还有一个单独的运算符new []用于为数组分配内存 - 但你几乎肯定更好地完全忽略了整个混乱。
new运算符通常用于从免费商店创建对象:
my_class *x = new my_class(0);
两者之间的区别在于运营商new 只是分配原始内存,没有别的。 new运算符首先使用operator new来分配内存,然后它调用正确类型对象的构造函数,因此结果是在该内存中创建的真实活动对象。如果该对象包含任何其他对象(嵌入式或基类),那么这些构造函数也会被调用。
答案 1 :(得分:33)
“operator new”
class Foo
{
public:
void* operator new( size_t );
}
“新运营商”:
Foo* foo = new Foo();
在此示例中,new Foo()
调用Foo::operator new()
换句话说,“新运算符”会调用“operator new()
”,就像+运算符调用operator +()
答案 2 :(得分:21)
以下是来自Scott Meyers的更有效的C ++书籍的引用:
new运算符调用函数 执行必要的记忆 分配,你可以重写或 超载那个改变它的功能 行为。函数的名称 new运算符调用以分配内存 是新的运营商。
答案 3 :(得分:10)
“new operator”和“operator new”之间没有区别。两者都引用相同的东西:可重载/可替换operator new
函数,它通常为 new-expressions 创建的对象执行原始内存分配。
另请注意, 这两个术语都不存在于语言规范中(这是官方术语的定义来源)。
在程序中使用new
创建对象时,它被称为 new-expression 。 New-expression 由关键字new
和语法定义的其他语法部分组成。此表达式语法的任何部分都不会被称为“运算符”。
原始内存分配函数operator new
官方称为“operator new
函数”。请注意,此序列中的单词operator
和new
只是两个单独的C ++语言关键字。它们不构成英文术语“operator new”。在语言规范中没有任何地方你会发现任何对“operator new”的引用作为英语术语。每次这只是两个独立关键字的组合,它们为内存分配函数生成声明语法。
同样,在简历中:正式在C ++中,没有像“operator new”或“new operator”这样的英语术语。前一个序列在语言规范中仅作为关键词的组合出现,而不是英语术语。后者根本不存在。
答案 4 :(得分:6)
使用 operator new 创建新对象时,内存已分配,然后调用构造函数初始化内存。 new运算符执行分配和初始化,其中operator new仅进行分配。
答案 5 :(得分:4)
OP的问题没有说得恰到好处。最好分阶段为'运算符新'和'新表达'之间的差异?'注意'operator new'通常也指'operator new function'。
周围有很多正确答案,下面是我的:
1&GT; '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.
答案 6 :(得分:2)
新运营商: C ++支持使用new运算符动态分配对象。 new运算符为名为free store的池中的对象分配内存。 new运算符调用特殊函数operator new。
operator new : 如果请求是零字节存储,则operator new返回指向不同对象的指针(即,对operator new的重复调用返回不同的指针)。如果分配请求的内存不足,operator new将返回NULL或引发异常。 operator new的第一个参数必须是size_t类型(STDDEF.H中定义的类型),返回类型始终为void *。
以下是MSDN链接以获取更多详细信息:
答案 7 :(得分:1)
new 是一个运算符和关键字。
参见[1] 2.13&amp;&amp;在2.12。
new 做两件事:T * t = new T(arg);
1)为对象分配内存:void * ptr = operator new (sizeof(T));
// operator new 是一个函数(就像c中的malloc一样),而不是运算符。(参见[1] 3.7.4)。但是第7项[2]说它也是一个运营商。在我看来,操作符和函数之间的区别很小,当你回想起重载操作符由函数实现时,你可以看到它。
//我们可以重载这个操作符/函数(operator new)来做我们想要的事情。
2)初始化分配的内存中的对象:在ptr上调用T :: T(arg)
// 仅编译器可以执行此操作。我和你都不能。
//如果T有,它们也会调用成员对象的构造函数和基类的构造函数。这个调用是递归的。只有编译器可以做到这一点。
因此,operator new执行新任务的一部分,只有在这部分我们才能做点什么。
[1]:ISO / IEC,N3690。 http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf
[2]:迈耶斯,斯科特。有效的C ++,第3版。