'new operator'和'operator new'之间的区别?

时间:2009-12-11 04:51:29

标签: c++

“new operator”和“operator new”有什么区别?

8 个答案:

答案 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函数”。请注意,此序列中的单词operatornew只是两个单独的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链接以获取更多详细信息:

The operator new Function

The new Operator

答案 7 :(得分:1)

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

    参见[1] 2.13&amp;&amp;在2.12。

  2. 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有,它们也会调用成员对象的构造函数和基类的构造函数。这个调用是递归的。只有编译器可以做到这一点。

  3. 因此,operator new执行新任务的一部分,只有在这部分我们才能做点什么。

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

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

相关问题