【发布时间】:2016-12-09 12:54:01
【问题描述】:
在 malloc 函数用于内存分配的情况下,我们指定我们想要分配的大小
void *malloc(8);
但如果是新的,我们不会像下面这样指定尺寸
Foo *fo = new Foo();
所以,我的问题是 new 运算符函数如何知道它需要为对象分配的大小。请解释一下,幕后发生了什么?
【问题讨论】:
标签: c++ new-operator
在 malloc 函数用于内存分配的情况下,我们指定我们想要分配的大小
void *malloc(8);
但如果是新的,我们不会像下面这样指定尺寸
Foo *fo = new Foo();
所以,我的问题是 new 运算符函数如何知道它需要为对象分配的大小。请解释一下,幕后发生了什么?
【问题讨论】:
标签: c++ new-operator
编译器已经看到Foo的定义,所以它知道需要多少内存。 new Foo 实质上变成了两个操作:operator new(sizeof Foo) 分配内存,然后在新分配的空间中构造 Foo 对象。
【讨论】:
与malloc 完全相同。 operator new 接受一个指定要分配的字节数的参数。
http://en.cppreference.com/w/cpp/memory/new/operator_new
您不需要手动指定大小,因为编译器会在使用new 时自动传递类型的大小。为此,类型必须是完整类型(您不能将 new 与不完整类型一起使用)。
【讨论】:
new Foo 中,new 是 new 运算符,而不是 operator new。使用“operator new”,您确实必须手动指定尺寸;使用 new 运算符,编译器会计算出来,并使用适当的值调用 operator new。