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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值