定位new

C++ new 与 delete

可紊 提交于 2019-12-13 14:05:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> new与delete表达式作了什么 对于new来说 计算所需内存的字节数,然后以此为参数调用标准库的operator new(size_t)函数 在operator new()返回的内存上调用类的适当的构造函数初始化一个对象 将operator new() 返回的指针作为表达式的运算结果 也即 new 把内存分配与对象构造合在一起了 对于delete来说 调用指针所指对象的析够函数释放对象本身 调用标准库的operator delete()函数将指针所指内存返还给系统 也即 delete 把释放对象本身与释放对象所占的内存合在一起 new[] 与 delete[] 行为与上类似 allocator类 很多时候并不需要立即在分配的内存上初始化一个对象,与此同时也希望在释放内存之前不调用对象的析钩函数;allocator类提供了这种机制,其成员: allocator<T> a; /* a可以用来分配原始内存以及在原始内存上构造T类型对象 */ a.allocate(n); /* 分配原始的内存,可以保存n个Type类型的对象 */ a.deallocate(p,n);/* 释放p所指的原始内存,p必须合法;并且不会调用p所指对象的析钩函数,n表示p所指的内存可以保存n个T类型对象 */ a.construct(p

C++ Primer Plus(十二)——类和动态内存分配

烂漫一生 提交于 2019-12-01 12:12:06
静态数据成员在类声明中声明,在包含类方法的文件中初始化。初始化时使用作用域运算符来指出静态成员所属的类。但如果静态成员是整型或枚举型const,则可以在类声明中初始化。 strlen返回字符串长度,但不含末尾的空字符 字符串并不保存在对象中,而是单独保存在堆内存中,对象仅保存了到哪去查找字符串的信息。 删除对象可以释放对象本身占用的内存,但不能自动删释放属于对象成员的指针所指向的内存,所以必须使用析构函数并用delete释放这种内存。 按值传递、生成临时对象时,都将调用复制构造函数。 如果类中包含了使用new初始化的指针成员,则应当定义一个复制构造函数,以复制指向的数据,而不是指针,这类称为深度复制,复制的另一种形式是调用隐式复制构造函数,进行浅复制,浅复制仅仅复制指针信息,而不会深入挖掘以复制指针引用的结构。 与复制构造函数相似,赋值运算符的隐式实现也对成员进行逐个复制。 复制构造函数和赋值构造函数的重新定义上的区别: 由于目标对象可能引用了以前分配的数据,所以函数应用delete[ ] 来释放这些数据 函数应当避免将对象赋给自身;否则给对象重新赋值前,释放内存操作可能删除对象的内容 函数返回一个指向调用对象的引用 delete[ ] 与使用new[ ]初始化指针和空指针都兼容,对于以其他方式初始化的指针,使用delete[ ]时,结果将是不确定的,如 new char[1]与