动态内存开辟--new_delete和malloc_free(十八)
2017-09-23 17:45
281 查看
一、内存开辟
在C++编程中有两种内存开辟方式:
一种是静态内存开辟空间,这类是在栈中开辟,由编译器在编译程序时就能够确定空间大小,如定义char a; int b;因为a先定义,b后定义,在栈中a的地址要小,b的地址要大;
第二种是动态开辟,是在程序运行时需要动态定义空间的大小,通过malloc或new来进行开辟,这部分空间是在堆上进行开辟的,所以在程序结束前需要进行free或delete来进行释放,否则会存在内存泄露。
二、对普通类型malloc_free和new_delete的区别
对于动态开辟空间有两种方式,一种是malloc,对应的释放空间方式是free,一种是new,对应的释放空间是delete。两种有很多区别,对于普通类型进行开辟空间区别不是很大,主要有一下几种:
(1)malloc和free是C中定义的开辟空间方式,而new和delete是C++中定义的开辟空间方式,其中底层一般用到的都是malloc和free;
(2)对于普通类型,malloc定义空间需要给出空间的大小,即字节数,而new可以根据开辟空间的内容自动算出;如malloc(sizeof(int)*10),而new通过new int[10];
(3)对于malloc返回的是void*类型,需要进行强制类型转换,如(int*)malloc(sizeof(int)*10),而new直接返回申请空间的类型,如new int[10];
(4)对于释放,free直接释放指针即可,如free(p),而delete在释放单个普通数据时使用delete q,而如果是释放数组则使用delete []q。
示例如下:
int main(int argc, char** argv){
int* p = (int*)malloc(sizeof(int)*10);
for(int i=0; i<10; ++i){
p[i] = i+1;
}
free(p);
int* q = new int[10];
for(int j=0; j<10; j++){
q[j]=j+1;
}
delete []q;
}
三、对与类类型,malloc_free和new_delete的区别
两者的区别主要体现在对类类型的空间开辟和释放上,因为new和delete是为C++设计的开辟空间和释放空间的操作符,所以对于类类型有特殊的功能:
使用new开辟新空间时会先开辟空间,再调用构造函数并对对象进行初始化,使用delete释放空间时会调用析构函数析构对象,再释放空间。
那么对于自动调用构造函数,对于单个对象在开辟空间时可以传入初始化值对对象进行初始化,对于数组对象,开辟空间无法传入初始化值,所以需要类类型具有默认的构造函数。
实例如下:
#include <iostream>
class Test{
public:
Test(int d=2):data(d){
std::cout<<"construct function"<<std::endl;
}
~Test(){
std::cout<<"free function"<<std::endl;
}
void print_data(){
std::cout<<data<<std::endl;
}
private:
int data;
};
#include "new.h"
int main(int argc, char** argv){
Test* t = (Test*)malloc(sizeof(Test));
t->print_data();
free(t);
Test* ta = (Test*)malloc(sizeof(Test)*10);
(ta+3)->print_data();
free(ta);
Test* tn = new Test(100);
tn->print_data();
delete tn;
Test* tarr = new Test[10];
tarr[3].print_data();
delete []tarr;
}
在C++编程中有两种内存开辟方式:
一种是静态内存开辟空间,这类是在栈中开辟,由编译器在编译程序时就能够确定空间大小,如定义char a; int b;因为a先定义,b后定义,在栈中a的地址要小,b的地址要大;
第二种是动态开辟,是在程序运行时需要动态定义空间的大小,通过malloc或new来进行开辟,这部分空间是在堆上进行开辟的,所以在程序结束前需要进行free或delete来进行释放,否则会存在内存泄露。
二、对普通类型malloc_free和new_delete的区别
对于动态开辟空间有两种方式,一种是malloc,对应的释放空间方式是free,一种是new,对应的释放空间是delete。两种有很多区别,对于普通类型进行开辟空间区别不是很大,主要有一下几种:
(1)malloc和free是C中定义的开辟空间方式,而new和delete是C++中定义的开辟空间方式,其中底层一般用到的都是malloc和free;
(2)对于普通类型,malloc定义空间需要给出空间的大小,即字节数,而new可以根据开辟空间的内容自动算出;如malloc(sizeof(int)*10),而new通过new int[10];
(3)对于malloc返回的是void*类型,需要进行强制类型转换,如(int*)malloc(sizeof(int)*10),而new直接返回申请空间的类型,如new int[10];
(4)对于释放,free直接释放指针即可,如free(p),而delete在释放单个普通数据时使用delete q,而如果是释放数组则使用delete []q。
示例如下:
int main(int argc, char** argv){
int* p = (int*)malloc(sizeof(int)*10);
for(int i=0; i<10; ++i){
p[i] = i+1;
}
free(p);
int* q = new int[10];
for(int j=0; j<10; j++){
q[j]=j+1;
}
delete []q;
}
三、对与类类型,malloc_free和new_delete的区别
两者的区别主要体现在对类类型的空间开辟和释放上,因为new和delete是为C++设计的开辟空间和释放空间的操作符,所以对于类类型有特殊的功能:
使用new开辟新空间时会先开辟空间,再调用构造函数并对对象进行初始化,使用delete释放空间时会调用析构函数析构对象,再释放空间。
那么对于自动调用构造函数,对于单个对象在开辟空间时可以传入初始化值对对象进行初始化,对于数组对象,开辟空间无法传入初始化值,所以需要类类型具有默认的构造函数。
实例如下:
#include <iostream>
class Test{
public:
Test(int d=2):data(d){
std::cout<<"construct function"<<std::endl;
}
~Test(){
std::cout<<"free function"<<std::endl;
}
void print_data(){
std::cout<<data<<std::endl;
}
private:
int data;
};
#include "new.h"
int main(int argc, char** argv){
Test* t = (Test*)malloc(sizeof(Test));
t->print_data();
free(t);
Test* ta = (Test*)malloc(sizeof(Test)*10);
(ta+3)->print_data();
free(ta);
Test* tn = new Test(100);
tn->print_data();
delete tn;
Test* tarr = new Test[10];
tarr[3].print_data();
delete []tarr;
}
相关文章推荐
- 动态内存管理详解:malloc/free/new/delete/brk/mmap(介绍的很明白)
- 动态内存开辟C语言和C++,new与delete,malloc和free,operator new 和operator delete
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
- 动态内存开辟:new/delete,malloc/free区别与联系
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- 堆区,栈区,new/delete/malloc/free(转载)
- malloc/free 和 new/delete的区别
- C++中new,delete详解及其与malloc,free的区别
- C++入门学习:new,delete及其和malloc,free的区别
- new/delete 和 malloc/free 的区别
- new delete和malloc free的用法与区别
- malloc/free与new/delete的区别
- new delete malloc free的区别
- new/delete 和malloc/free 的区别(综合转帖)
- C/C++ Basic-- the differs between [malloc&free] and [new &delete]
- 动态分配的标准写法(new, delete; malloc, free)
- new/delete 与 malloc/free 的区别是什么?
- malloc/free 与 new/delete的区别与联系