2015-03-25 40 views
-13
string *ptr = new string("Hello"); 

当我们呼叫新运营商时会发生什么?简单点解释。“新”和“运营商新”之间的关系

+4

我非常怀疑你的问题是一个很适合这个网站。请参考:http://stackoverflow.com/help/how-to-ask。礼貌也有帮助。 – 2015-03-25 07:40:51

+1

你自己研究了什么,你究竟知道些什么?由于这是一个相当初级的问题,我假设你正在从[好书](http://stackoverflow.com/q/388242/1782465)或教程中学习。它是如何解释的以及该解释的哪些部分不清楚? – Angew 2015-03-25 07:46:37

回答

0
​​

新的运营商主要做了两两件事:

  1. 它分配足够的存储空间来保存请求的类型的对象。 (在上例中,它分配足够的内存来容纳此字符串对象)

    1. 它调用一个构造函数来初始化已分配内存中的对象。

现在这个“新”是调用哪个函数?

它是运营商新的。

void * operator new (size_t size); 

返回类型是void *。 由于此函数返回一个指向raw的指针,该指针未被键入并且未初始化的内存足够大以容纳指定类型的对象。 size_t指定分配多少内存。

如果我们直接调用operator new,它会返回一个指向足够容纳一个字符串对象的内存块的指针。

void *pointRawMemory = operator new(sizeof(string)); 

运算符new类似于malloc。它只负责分配内存。它对构造函数一无所知。 “新”运算符的工作是采用运算符新返回并将其转换为对象的原始内存。

0

一个字符串对象被分配在动态存储区中并且它的构造函数被调用(接收const char *的那个)。

然后,该构造函数的结果(对象的地址)被放入ptr变量中,该变量可能存在于许多不同的存储区之一(如静态存储区或堆栈中),具体取决于声明实际上在你的代码中是

这就是所有你需要知道的一切,“在...下”,这是一个实现细节。

根据operator newnew之间的差异,前者在较低的抽象层次上运行,只是简单地分配足够的内存来存储某些内容,而不调用任何构造函数。