"new" 和 "operator new" 之间的关系
Relation between "new" and "operator new"
string *ptr = new string("Hello");
当我们调用 new 运算符时会发生什么?简明扼要地解释一下。
string *ptr = new string("Hello");
new操作符主要做了两件事:
它分配了足够的内存来容纳请求类型的对象。
(在上面的例子中,它分配了足够的内存来容纳这个字符串对象)
- 它调用构造函数来初始化分配的内存中的对象。
现在这个“新”正在调用哪个函数?
它是新的运营商。
void * operator new (size_t size);
return 类型为 void*。
因为这个函数 returns 是一个指向 raw 的指针,它没有类型化并且未初始化的内存足够大以容纳指定类型的对象。
size_t 指定要分配多少内存。
如果我们直接调用 operator new ,它 return 是一个指向足以容纳字符串对象的内存块的指针。
void *pointRawMemory = operator new(sizeof(string));
operator new 类似于malloc。它只负责分配内存。它对构造函数一无所知。
“new”运算符的工作是获取 operator new returns 的原始内存并将其变成一个对象。
在动态存储区中分配了一个字符串对象并调用了它的构造函数(接收const char *
的那个)。
然后将那个构造函数的结果(对象的地址)放入ptr
变量中,这个变量可能存在于很多不同的存储区之一(比如静态存储区或者栈上) ,取决于该语句在您的代码中 实际 的位置。
这就是您真正需要了解的所有内容,所有 "under" 实施细节。
就operator new
和new
的区别而言,前者在较低的抽象层次上运行,只是分配足够的内存来存储一些东西,而不调用任何构造函数。
string *ptr = new string("Hello");
当我们调用 new 运算符时会发生什么?简明扼要地解释一下。
string *ptr = new string("Hello");
new操作符主要做了两件事:
它分配了足够的内存来容纳请求类型的对象。 (在上面的例子中,它分配了足够的内存来容纳这个字符串对象)
- 它调用构造函数来初始化分配的内存中的对象。
现在这个“新”正在调用哪个函数?
它是新的运营商。
void * operator new (size_t size);
return 类型为 void*。 因为这个函数 returns 是一个指向 raw 的指针,它没有类型化并且未初始化的内存足够大以容纳指定类型的对象。 size_t 指定要分配多少内存。
如果我们直接调用 operator new ,它 return 是一个指向足以容纳字符串对象的内存块的指针。
void *pointRawMemory = operator new(sizeof(string));
operator new 类似于malloc。它只负责分配内存。它对构造函数一无所知。 “new”运算符的工作是获取 operator new returns 的原始内存并将其变成一个对象。
在动态存储区中分配了一个字符串对象并调用了它的构造函数(接收const char *
的那个)。
然后将那个构造函数的结果(对象的地址)放入ptr
变量中,这个变量可能存在于很多不同的存储区之一(比如静态存储区或者栈上) ,取决于该语句在您的代码中 实际 的位置。
这就是您真正需要了解的所有内容,所有 "under" 实施细节。
就operator new
和new
的区别而言,前者在较低的抽象层次上运行,只是分配足够的内存来存储一些东西,而不调用任何构造函数。