【问题标题】:Relation between "new" and "operator new" [closed]“新”和“新运营商”之间的关系[关闭]
【发布时间】:2015-05-28 18:50:05
【问题描述】:
string *ptr = new string("Hello");
当我们调用 new 运算符时会发生什么?简明扼要地解释。
【问题讨论】:
-
-
你自己研究过什么,你到底有什么不明白的?由于这是一个相当初级的问题,我假设您正在从good book 或教程中学习。那里是如何解释的,解释的哪些部分不清楚?
标签:
c++
new-operator
internals
【解决方案1】:
在动态存储区分配一个字符串对象,并调用它的构造函数(接收const char *的那个)。
然后将该构造函数的结果(对象的地址)放入ptr 变量中,该变量可能存在于许多不同的存储区域之一(例如静态存储区域或堆栈上),具体取决于位置该语句实际上 is 在您的代码中。
这就是你需要知道的全部内容,所有“下”都是实现细节。
就operator new和new的区别而言,前者运行在较低的抽象层次,只是分配足够的内存来存储东西,而不是调用任何构造函数。
【解决方案2】:
string *ptr = new string("Hello");
new操作符主要做了两件事:
-
它分配足够的内存来保存请求类型的对象。
(在上面的例子中,它分配了足够的内存来保存这个字符串对象)
- 它调用构造函数来初始化分配的内存中的对象。
现在这个“新”正在调用哪个函数?
是运算符new。
void * operator new (size_t size);
返回类型为 void*。
由于此函数返回一个指向 raw 的指针,该指针未键入且未初始化的内存大到足以容纳指定类型的对象。
size_t 指定要分配多少内存。
如果我们直接调用 operator new ,它会返回一个指针,指向一块足以容纳一个字符串对象的内存。
void *pointRawMemory = operator new(sizeof(string));
操作符 new 类似于 malloc。它只负责分配内存。它对构造函数一无所知。
“new”运算符的工作是获取运算符 new 返回的原始内存并将其制成对象。