C++学习之new与delete、malloc与free
2014-07-26 01:55
351 查看
在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。这篇文章仅仅是浅显的讲一下,仅供参考。
new表达式
标准库定义了operator new函数的几个重载版本,没有使用
当我们使用new表达式时,实际执行了三步操作:
new表达式调用上面的operator new(或者operator new[])的标准库函数,函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或者对象的数组)。
编译器运行相应的构造函数以构造这些对象,并为其传入初始值。
对象被分配了空间并构造完成,返回一个指向该对象的指针。
对于operator new函数或者operator new[]函数来说,它的返回类型必须是void*,第一个形参的类型必须是size_t且该形参不能含有默认实参。当编译器调用operator new或者operator new[]函数时,会把存储指定对象或者指定对象的数组所需的字节数传给size_t形参。
delete表达式
标准库也定义了operator delete函数的几个重载版本,
当我们使用delete表达式时,实际执行了两步操作:
对指针所指的对象或者所指的数组中的元素执行对应的析构函数。
编译器调用operator delete(或者operator delete[])的标准库函数释放内存空间。
对于operator delete函数或者operator delete[]函数来说,它们的返回类型必须是void,第一个形参的类型必须是void*。执行一条delete表达式将调用相应的operator函数,并用指向待释放内存的指针来初始化void*形参。
malloc函数接受一个表示待分配字节数的size_t,返回指向分配空间的指针;如果分配失败,则返回空指针。free函数接受一个void*,它是malloc返回的指针的副本,free将相关内存返还给系统。注意:malloc函数并不会调用构造函数来初始化内存,free函数也不会自动调用析构函数。
new是一个运算符,malloc()是一个库函数。
new会调用构造函数,而malloc()不会。
new返回指定类型的指针,而malloc()返回void*。
new会自动计算需要分配的空间,而malloc()需要手工计算字节数。
new可以被重载,而malloc()不能。
delete和free的区别:
delete是一个运算符,free()是一个库函数。
delete会调用析构函数,而free()不会。
delete可以被重载,而free()不能。
总结:
malloc和free是C/C++中的标准库函数,new和delete是C++的运算符。对于非内置数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。
一、new和delete
new和delete是C++的运算符,用于动态分配内存和释放内存。new表达式
标准库定义了operator new函数的几个重载版本,没有使用
noexcept说明的版本在内存分配失败时可能会抛出bad_alloc异常,而使用了的不会抛出异常。
void* operator new ( size_t ); void* operator new[]( size_t ); void* operator new ( size_t , const nothrow_t& ) noexcept; void* operator new[]( size_t , const nothrow_t& ) noexcept;
当我们使用new表达式时,实际执行了三步操作:
new表达式调用上面的operator new(或者operator new[])的标准库函数,函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或者对象的数组)。
编译器运行相应的构造函数以构造这些对象,并为其传入初始值。
对象被分配了空间并构造完成,返回一个指向该对象的指针。
对于operator new函数或者operator new[]函数来说,它的返回类型必须是void*,第一个形参的类型必须是size_t且该形参不能含有默认实参。当编译器调用operator new或者operator new[]函数时,会把存储指定对象或者指定对象的数组所需的字节数传给size_t形参。
delete表达式
标准库也定义了operator delete函数的几个重载版本,
noexcept说明符表示在内存分配失败时返回空指针而不是抛出bad_alloc异常。
void operator delete ( void* ) noexcept; void operator delete[]( void* ) noexcept; void operator delete ( void* , const nothrow_t& ) noexcept; void operator delete[]( void* , const nothrow_t& ) noexcept;
当我们使用delete表达式时,实际执行了两步操作:
对指针所指的对象或者所指的数组中的元素执行对应的析构函数。
编译器调用operator delete(或者operator delete[])的标准库函数释放内存空间。
对于operator delete函数或者operator delete[]函数来说,它们的返回类型必须是void,第一个形参的类型必须是void*。执行一条delete表达式将调用相应的operator函数,并用指向待释放内存的指针来初始化void*形参。
二、malloc和free
malloc和free是C/C++中的标准库函数,也是用于申请动态内存和释放内存。void* malloc( size_t size ); void free( void* ptr );
malloc函数接受一个表示待分配字节数的size_t,返回指向分配空间的指针;如果分配失败,则返回空指针。free函数接受一个void*,它是malloc返回的指针的副本,free将相关内存返还给系统。注意:malloc函数并不会调用构造函数来初始化内存,free函数也不会自动调用析构函数。
三、new和malloc、delete和free的区别
int *p1 = new int; // 没有初始化列表, 所以没有初始化 int *p2 = new int(); // 空初始化列表, 执行zero初始化, 所以初始化为0 int *p3 = new int(3); // 非空初始化列表, 执行值初始化, 所以初始化为3 // 注:对于没有构造函数的内置类型,new会不会初始化在于有没有初始列表(空列表“()”也算) int *p4 = new int[100]; // 分配大小为sizeof(int)*100; int *p5 = (int*)malloc(sizeof(int)*128); double *p6 = (double*)malloc(sizeof(double)*12);new和malloc的区别:
new是一个运算符,malloc()是一个库函数。
new会调用构造函数,而malloc()不会。
new返回指定类型的指针,而malloc()返回void*。
new会自动计算需要分配的空间,而malloc()需要手工计算字节数。
new可以被重载,而malloc()不能。
delete p1; delete [] p2; free(p3); free(p4);
delete和free的区别:
delete是一个运算符,free()是一个库函数。
delete会调用析构函数,而free()不会。
delete可以被重载,而free()不能。
总结:
malloc和free是C/C++中的标准库函数,new和delete是C++的运算符。对于非内置数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。
相关文章推荐
- C++入门学习:new,delete及其和malloc,free的区别
- C++学习笔记(七)malloc、free、 new、delete与二维数组
- C++学习之new与delete、malloc与free
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存
- 学习之第一周小结 malloc、calloc、realloc、free、new、delete函数应用
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C++中new(delete)和malloc(free)的常见问题
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C++ 内存管理之四(new/delete vs malloc/free)
- C++中有了malloc/free,为什么还需要new/delete
- C与C++中内存分配释放-malloc,free,new,delete
- Effective C++学习笔记:条款3:尽量用new和delete而不用malloc和free
- C++中有了malloc/free,为什么还要用new/delete
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C++中有了malloc/free,为什么还需要new/delete?
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free (转载)
- C++ 内存管理之四(new/delete vs malloc/free)
- C/C++内存分配方式,栈区堆区 new/delete/malloc/free
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free