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

San*_*eep 116 c++

"new operator"和"operator new"有什么区别?

Jer*_*fin 118

我通常会尝试用不同的方式来区分两者,以便更好地区分两者,但无论如何这都是一个很好的问题.

运算符new是一个分配原始内存的函数 - 至少在概念上,它没有太大的不同malloc().虽然这是相当不寻常的,除非你正在编写类似于你自己的容器,你可以直接调用operator new,例如:

char *x = static_cast<char *>(operator new(100));
Run Code Online (Sandbox Code Playgroud)

也可以在全局或特定类中重载operator new.IIRC,签名是:

void *operator new(size_t);
Run Code Online (Sandbox Code Playgroud)

当然,如果重载运算符new(全局或类),您还需要/也需要重载匹配的运算符delete.对于它的价值,还有一个单独的运算符new []用于为数组分配内存 - 但你几乎肯定最好完全忽略整个混乱.

新运算符是您通常用于从免费商店创建对象的运算符:

my_class *x = new my_class(0);
Run Code Online (Sandbox Code Playgroud)

两者之间的区别在于operator new 分配原始内存,没有别的.new运算符首先使用operator new来分配内存,然后它调用正确类型对象的构造函数,因此结果是在该内存中创建的真实活动对象.如果该对象包含任何其他对象(嵌入式或基类),那么这些构造函数也会被调用.

  • +1,对于不同的措辞,标准使用*new expression*all around,并且只使用*new operator*来引用呼叫地点.我倾向于这样做:*operator new*用于*allocator*和*new expression*供使用. (17认同)
  • 一个新的表达式是以new开头的整个短语.那么你怎么称呼它的"新"部分呢?如果调用new运算符是错误的,那么我们不应该调用sizeof运算符的"sizeof",或者运算符的地址(当它的行为类似于运算符时). (3认同)
  • "operator new"vs"new keyword" (2认同)
  • @antred:你会用`operator delete(x);`来释放它. (2认同)

Aus*_*yde 33

"运营商新"

class Foo
{
public:
        void* operator new( size_t );
}
Run Code Online (Sandbox Code Playgroud)

"新运营商":

Foo* foo = new Foo();
Run Code Online (Sandbox Code Playgroud)

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

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

  • `new`不是C++中的运算符.例如,`sizeof`是一个运算符,但`new`和`delete`则不是.`new`和`delete`是关键字,这些关键字形成的句法结构称为*new-expression*和*delete-expression*. (13认同)
  • 不正确.官方C++术语是语言规范定义的术语,而不是某些网站定义的术语.在语言规范中,没有像"new operator"这样的词,但是有一个术语"`operator new` function".同样,`sizeof`是明确的,被称为"运算符",而`new`和`delete`则*从不*称为运算符. (7认同)
  • AndreyT:不正确.C++标准将'new'称为运算符,参见13.5/1. (6认同)
  • @AndreyT:我认为,*operator new*是*allocator*和*new-expression*的用途.我审查并检查了§5.3.4/ 3中的当前标准使用了*new运算符*.稍后在§5.3.4/ 8中,它将分配器函数命名为*operator new*和*operator new []* (3认同)
  • 呃,如果有的话,`sizeof`是句法结构,`new`和`delete`都是有效的,合法的,可过载的运算符.从我见过的所有内容来看,`new`和`delete`都是运算符.见[cplusplus.com] [http://cplusplus.com/doc/tutorial/classes2/] (2认同)
  • 那么,我们能否同意这个**具体的**问题,即"new"是一个运算符?在日常使用中,'new`实际上是一个定义的表达式*就像*运算符一样真的很重要吗?我理解AndreyT的观点,看看定义是如何重要的,但仅限于编译器如何解释它的上下文,而不是在这种情况下. (2认同)
  • 嗯,我同意.但是,当我看到原始问题时,这就是我所看到的:一个纯粹的*术语*问题.在我看来,术语问题应该是迂腐的. (2认同)

Nav*_*een 21

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

new运算符调用函数来执行必需的内存分配,您可以重写或重载该函数以更改其行为.新操作员调用以分配内存的函数的名称是operator new.

  • 该术语显然是由本书的作者发明的(或者,也许是从一些过时的来源借来的).在正式的C++命名法中,没有"新运算符"这样的术语. (6认同)
  • @AndreyT:我在"新运算符"中搜索了C++ 11,发现它在四个地方被引用.具体来说,两个引用"放置新运算符" (2认同)

AnT*_*AnT 10

"new operator"和"operator new"之间没有区别.两者都指向相同的东西:可重载/可替换的operator new函数,通常为新表达式创建的对象执行原始内存分配.

还需要注意的是既不术语存在于语言规范(其是正式术语的定义源极).

当您使用new在程序中创建一个对象,它被称为新的表达.New-expression由关键字new和语法定义的其他语法部分组成.此表达式语法的任何部分都不被称为"运算符".

原始内存分配功能operator new官方称为" operator new功能".请注意,单词operatornew此序列中只有两个单独的C++语言关键字.它们不构成英文术语"operator new".在语言规范中没有任何地方你会发现任何对"operator new"的引用作为英语术语.每次这只是两个独立关键字的组合,它们为内存分配函数生成声明语法.

同样,在简历中:正式在C++中,没有像"operator new"或"new operator"这样的英语术语.前一个序列在语言规范中仅作为关键词的组合出现,而不是英语术语.后者根本不存在.

  • 你似乎迷失在一些迂腐的心理手淫中.标准是模糊的,这是其中之一."讨论新运算符"与"讨论加运算符"或"讨论+运算符"一样有意义. (14认同)

Chr*_*tow 6

创建新对象时,使用operator new 分配内存,然后调用构造函数初始化内存.在新的运营商确实都分配和初始化,那里的运营商新的只做分配.


Gob*_*0st 6

OP的问题措词不正确。最好将其定为“'新运营商'与'新表达'之间的区别?” 注意“新的操作员”通常也指“新的操作员功能”。

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

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

apple * p = new apple(); //new expression
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)