C++学习:动态内存分配对象的new/delete运算符与函数malloc/free

来源:互联网 发布:立体设计软件下载 编辑:程序博客网 时间:2024/05/18 03:08

C++学习:对象的new/delete运算符与函数malloc/free

摘要:
在学习java的时候,都是使用new来创建新的对象的,对象的存放在堆里的.而回收是由java虚拟机garbage collectiong也就是GC来自动回收的

在学习C语言的时候,我们知道有malloc/calloc以及realloc来进行内存分配,使用free函数来释放内存,这也是在堆上进行操作的,如果不去手动管理内存的话,如int a = 10;这样的变量是分配在栈上的,在栈上分配的话,有个缺陷就是栈的空间相对比较小,所有的回收都是系统自动的.

在C++中前面使用的Student stu;这样的形式去创建对象的时候,也都是在栈上去进行内存分配的.但是C++也提供了比较重要的运算符new/delete来方便我们进行手动的堆内存管理;


提示

作者;章飞_906285288
博客地址:http://blog.csdn.net/qq_29924041


系统内存相关

在之前的学习C语言的时候,有部分说的就是关于系统内存相关的知识,linux系统环境下,会为每个进程都去分配4G的虚拟内存.这其中有1G的内存是内核空间和3G的用户空间.在3G的用户空间中又具体可以细化分为环境变量段,栈段,堆段,数据段,代码段等

全局变量,静态区域,常量----->data区域所有的类成员函数,和非成员函数代码------>代码区域为运行函数而分配的成员变量,函数参数,返回数据,返回地址---->栈区域动态内存分配----->堆区域

1:代码一般存放在代码区域 ,数据根据不同的类型存放在不同的区域
2:Bss段,存放没有初始化或者初始化为0的区域
3:大多数操作系统在加载程序的时候会把Bss段的全局变量清0,为了保证程序的可移植性,最好手动清0
4:data段存放的是初始化为非0的区域
5:静态变量是第一次进入作用域的时候被初始化,是在类之间共享数据.只有一份
6:rodata存放常量区域,但是常量不一定就是存放在rodata区域,也有可能存放在text区域
7:字符串常量,编译器一般会去掉重复的字符串,保证了只有一个副本,并且常量是不能够进行修改的
8:字符串会被编译器放在rodata区域,并且加了const修饰的全局变量也会被放在rodata区域
9:栈中存储的是自动变量或者局部变量,以及传递的参数
10:堆是用户自动控制的内存区域,存储动态产生的数据
11:使用static修饰的对象,在作用域内不会被析构.并且会直接进行初始化

C++的运算符new/delete
1:在堆上生成对象,需要自动调用构造函数
2:在堆上生成对象,在释放的时候需要自动调用析构函数
3:new/delete和malloc/free需要成对的使用
4:new[]/delete[]生成和释放对象数组
5:new/delete是运算符号,malloc/free是函数

/* * =========================================================================== * *       Filename:  TestNewDelete.cpp *    Description:   *        Version:  1.0 *        Created:  2017年06月03日 17时02分23秒 *       Revision:  none *       Compiler:  gcc *         Author:   (),  *        Company:   * * =========================================================================== */#include<iostream>#include<stdlib.h>using namespace::std;class Test{  public:    Test():m_num(0){      cout<<"Test"<<endl;    };    ~Test(){      cout<<"~Test"<<endl;    }    void print(){      cout<<"num:"<<m_num<<endl;    };  private:    int m_num;};class Test_Two{  public:    Test_Two(int num){      this->num = num;      cout<<"Test_Two"<<endl;    };    ~Test_Two(){      cout<<"~Test_Two"<<endl;    };  private:    int num;};int main(int argc,char *argv[]){  {    Test a;  }  cout<<"end of}"<< endl;  //new出来的是Test的指针变量  Test* test = new Test();  test->print();  delete test;  //在delete之后是需要将其变为NULL的  test = NULL;  //使用malloc  int *p_pointer = (int *)malloc(sizeof(int));  *p_pointer = 10;  cout <<"*pointer"<< *p_pointer <<endl;  free(p_pointer);  p_pointer = NULL;  //使用new[]/delete[]  Test *test_array = new Test[2];  delete [] test_array;  //有参函数的new/delete  Test_Two* t = new Test_Two(10);  delete t;  return 0;}
阅读全文
0 0
原创粉丝点击