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;
}