string *ptr = new string("Hello");
当我们调用新运算符时会发生什么?简单解释一下。
答案 0 :(得分:0)
string *ptr = new string("Hello");
新运营商主要做两件事:
它分配足够的内存来保存所请求类型的对象。 (在上面的例子中,它分配了足够的内存来保存这个字符串对象)
现在这个“新”正在调用哪个函数?
这是操作员新的。
void * operator new (size_t size);
返回类型为void *。 由于此函数返回一个指向raw的指针,该指针未被打字,未初始化的内存大到足以容纳指定类型的对象。 size_t指定要分配的内存量。
如果我们直接调用operator new,它会返回一个指向一块内存的指针,足以容纳一个字符串对象。
void *pointRawMemory = operator new(sizeof(string));
operator new类似于malloc。它只负责分配内存。它对构造函数一无所知。 “new”运算符的工作是获取运算符new返回的原始内存并将其作为对象。
答案 1 :(得分:0)
在动态存储区域中分配一个字符串对象,并调用其构造函数(接收const char *
的那个)。
然后将该构造函数的结果(对象的地址)放入ptr
变量中,该变量可能存在于许多不同的存储区域(例如静态存储区域或堆栈中)之一,具体取决于在代码中 的那个语句的位置。
这真的是你需要知道的,“在”下面的所有内容都是一个实现细节。
就operator new
和new
之间的差异而言,前者在较低的抽象层运行,只需分配足够的内存来存储某些东西,而不是调用任何构造函数。