MoreEffectiveC++:理解new和delete

MoreEffectiveC++:理解new和delete,第1张

MoreEffectiveC++:理解new和delete,第2张

有时候人们似乎喜欢故意让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运算符,而不是直接调用构造函数来初始化对象。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » MoreEffectiveC++:理解new和delete

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情