C++对象创建的几种方式
由于公司的项目众多,且底层由众多团队操刀实施,这样不利于代码的管理和平台的统一性,所以为了将众多的底层C实现的代码整合起来,不得不借助C++的面相对象,而我也不得不捞起早已经忘的差不多的C++语法了。下面先来点简单的C++中对象创建的几种方式。
具体实现
先直接上代码,给大家演示一下,后续再来详细解释几种创建的方式,具体代码如下:
#include<stdio.h>
using namespace std;
class ObjectClass{
public:
void fun(){
printf("Hello, Im c++ objectClass\n");
}
};
int main(){
ObjectClass obj1;//栈中分配 ,由操作系统进行内存的分配和管理
ObjectClass obj2 = obj1; //栈中分配 ,由操作系统进行内存的分配和管理
obj1.fun();//"." 是结构体成员引用
obj2.fun();//"." 是结构体成员引用
ObjectClass * obj3 = new ObjectClass(); //堆中分配 ,由管理者进行内存的分配和管理,用完必须delete(),否则可能造成内存泄漏
obj3->fun();//->是指针引用
delete(obj3);
return 0;
}
root@A920:/system/bin # ./ObjectClass
Hello, Im c++ objectClass
Hello, Im c++ objectClass
Hello, Im c++ objectClass
上面就是具体的演示代码,下面分析一下几种创建方式:
(1).第一种和第二种:这两种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存。用这种方法创建的对象,内存分配到栈里(Stack)。使用 “.” 而不是 “->” 调用对象的方法。当程序离开对象的使用范围(如方法结束,一个程度块的最后{}),范围内的栈中的对象会自动删除,内存自动回收。这是创建对象最简单的方式栈是系统数据结构,对于线程/进程是唯一的,它的分配和释放由操作系统决定,不需要由开发者来管理。在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数执行完毕,系统会自动释放这些存储单元。
(2).第三种:使用了new,在堆中分配了内存,堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。注意:栈中内存的分配和管理由操作系统决定,而堆中内存的分配和管理由管理者决定。在堆中的对象不会自动删除,内存不会自动回收,所以new一个对象使用完毕,必须调用delete,释放内存空间。也就是说,new和delete必须成对出现
我们需要的内存很少,你又能确定你到底需要多少内存时,用栈。当你需要在运行时才知道你到底需要多少内存时,请用堆。
总结
最后我们来总结一下C++语法new创建对象的特点和C++内存分配常见的几种方式:
(1) 关于new创建类对象特点:
- new创建类对象需要指针接收,一处初始化,多处使用
- new创建类对象使用完需delete销毁
- new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
- new对象指针用途广泛,比如作为函数返回值、函数参数等
- 频繁调用场合并不适合new,就像new申请和释放内存一样
(2).C++内存分配三种方式:
-
从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
-
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束后在将这些局部变量的内存空间回收。在栈上分配内存空间效率很高,但是分配的内存容量有限。
-
从堆上分配的。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。