MoreEffectiveC++:理解new和delete
有时候人们似乎喜欢故意让C++语言的术语变得难以理解。例如,new运算符和new运算符之间的区别。
当您编写这样的代码时:
string *ps = new string("内存管理");
您使用的新是新运算符。这个操作符和sizeof一样,是语言的一部分。你不能改变它的意思。它的功能总是一样的。它的功能分为两部分。第一部分是分配足够的内存来容纳所需类型的对象。第二部分是它调用构造函数来初始化内存中的对象。新的操作符总是做这两件事,你不能以任何方式改变它的行为。
你能改变的是如何为对象分配内存。new运算符调用一个函数来完成必要的内存分配。您可以重写或重载该函数来更改其行为。new操作符调用的分配内存的函数名是operator new。
运算符new函数通常声明如下:
void *运算符new(size _ t size);
返回值类型是void*,因为这个函数返回一个原始指针,未初始化的内存。(如果你愿意,可以写一个operator new函数,在返回一个指针之前,可以初始化内存存储一些值,但一般不这么做。)参数size_t决定分配多少内存。可以添加额外的参数重载函数operator new,但第一个参数类型必须是size_t..(关于operator new的更多信息,请参考有效C++的第8至10条。)
通常,不直接调用operator new,但是一旦这样做了,就可以像调用其他函数一样调用它:
void *rawMemory =运算符new(sizeof(string));
运算符运算符new将返回一个指针,该指针指向一个足够大的内存,可以容纳string类型的对象。
就像malloc一样,operator new的职责只是分配内存。它对构造函数一无所知。operator new知道的是内存分配。new运算符的工作是将new运算符返回的未处理指针传递给一个对象。当您的编译器遇到如下语句时:
string *ps = new string("内存管理");
生成的代码或多或少类似于下面的代码(详见有效C++的第8条和第10条,以及我的文章Counting object中的注释。):
Void *memory = //获取未处理的内存
运算符new(sizeof(string));//在*内存上为String对象初始化
调用string:: string("内存管理")//;//在内存中
//的对象
String *ps = //是指向
static_cast(内存)的ps指针;//新对象
注意,第二步涉及到构造函数的调用,作为程序员的你是被禁止这样做的。你的编译器没有这个约束,它可以为所欲为。因此,如果要创建堆对象,必须使用new运算符,而不是直接调用构造函数来初始化对象。
位律师回复
0条评论