“新操作员”和“新操作员”之间的区别?

“新操作员”和“新操作员”有什么区别?

43078 次浏览

当您使用 新来的接线员创建一个新对象时,内存是 分配,然后构造函数被调用到 初始化内存。新的接线员同时进行分配和初始化,而作为运营商的 new 只进行分配。

以下是引自 Scott Meyers 的《更有效的 C + + 》一书:

新运算符调用一个函数 执行必要的内存 分配,您可以重写或 重载该函数以更改其 函数的名称 用于分配内存的新运算符调用 是新的接线员。

“新接线员”

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

「新营办商」 :

Foo* foo = new Foo();

在本例中,new Foo()调用 Foo::operator new()

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

“新操作员”和“新操作员”没有区别。这两个函数都指向同一个东西: 可重载/可替换的 operator new函数,该函数通常为由 新表达式创建的对象执行原始内存分配。

还要注意,都不是术语出现在语言规范中(这是官方术语的定义源)。

在程序中使用 new创建对象时,它被称为 新表达式新表达由关键字 new和语法定义的附加句法部分组成。这个表达式语法的任何部分都不会被称为“运算符”。

原始内存分配函数 operator new被正式称为“ operator new函数”。请注意,此序列中的 operatornew只是两个单独的 C + + 语言关键字。它们不构成英语术语“新操作员”。在语言规范中没有任何地方提到“运算符 new”作为英语术语。每次这只是两个独立关键字的组合,它们为内存分配函数生成声明语法。

同样,在简历中: 在 C + + 中,没有正式的英语术语,如“操作符新”或“新操作符”。前一个序列仅作为关键字的组合出现在语言规范中,而不是作为英语术语出现。后者根本不存在。

我通常会尝试用不同的措辞来区分这两者,但无论如何这都是个好问题。

运算符 new 是一个分配原始内存的函数——至少在概念上,它与 malloc()没有太大区别。虽然这是相当不寻常的,除非你写的东西像你自己的容器,你可以直接呼叫接线员 new,像:

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

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

void *operator new(size_t);

当然,如果重载一个操作符 new (全局的或者类的) ,您还需要/需要重载匹配的操作符 delete。值得一提的是,还有一个单独的操作符 new [] ,用于为数组分配内存——但是几乎可以肯定的是,完全忽略这个混乱状况会更好。

New 操作符通常用于从空闲存储中创建对象:

my_class *x = new my_class(0);

两者之间的区别在于,操作员 new 只是只分配原始内存,没有其他内存。New 操作符首先使用 new 操作符分配内存,然后调用构造函数以获得正确类型的对象,因此结果是在该内存中创建的实际活动对象。如果该对象包含任何其他对象(嵌入的或作为基类的) ,那么这些构造函数也会被调用。

新操作符 : C + + 支持使用 new 运算符动态分配对象。新运算符从称为空闲存储的池中为对象分配内存。New 运算符调用特殊函数运算符 new。

运营商 new : 如果请求的存储空间为零字节,那么 new 操作符将返回一个指向不同对象的指针(即,对 new 操作符的重复调用将返回不同的指针)。如果分配请求的内存不足,运算符 new 将返回 NULL 或引发异常。 New 操作符的第一个参数必须是 size _ t 类型(在 STDDEF.H 中定义的类型) ,并且返回类型总是 void * 。

以下是 MSDN 的详细链接:

运算符 new 函数

新的接线员

OP 的问题措辞不当。最好的阶段是’之间的差异’运算符新’和’新的表达式’?注意“运算符 new”通常也指“运算符 new 函数”。

这里有很多正确的答案,下面是我的:

1 > 调用’运算符 new’来分配原始内存,然后调用构造函数

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

2 > “运算符新”只分配原始内存,与 malloc 没有太大区别

void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.
  1. New 既是一个运算符,也是一个关键字。

    见[1]在2.13 & & 在2.12。

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

    1)为对象分配内存: void * ptr = 新来的接线员(sizeof (T)) ;

    //新来的接线员是一个函数(就像 c 中的 malloc 一样) ,而不是一个操作符。(见[1]于3.7.4)。但是第7项[2]说它也是一个操作员。在我看来,操作符和函数之间的区别很小,当您回想起重载操作符是由函数实现的时候,就可以看到这一点。

    //我们可以在这里重载这个操作符/函数(操作符 new)。

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

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

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

  3. 所以,操作员 new 做了 new 的部分任务,只有在这一部分我们可以做一些事情。

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

    [2] : Meyers,Scott,有效 C + + ,第3名。