内存管理

C中的 malloc 和C++中的 new 有什么区别

  • new 可以调用对象的构造函数,对应的 delete 调用相应的析构函数。 malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数

  • new、delete 是操作符,可以重载,只能在 C++中使用。malloc、free 是函数,可以覆盖,C、C++中都可以使用。

  • new、delete 返回的是某种数据类型指针,malloc、free 返回的是 void 指针。

简述 C、C++程序编译的内存分配情况

一个 C、C++程序编译时内存分为 5 大存储区:堆区、栈区、全局区、文字常量区、程序代码区。

  • 从静态存储区域分配: 内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static 变量等。

  • 在栈上分配: 在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  • 从堆上分配: 即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

简述 strcpy、sprintf 与 memcpy 的区别

  • strcpy 主要实现字符串变量间的拷贝,两个操作对象均为字符串

  • sprintf 主要实现其他数据类型格式到字符串的转化,操作源对象可以是多种数据类型,目的操作对象是字符串

  • memcpy 主要是内存块间的拷贝。两个对象就是两个任意可操作的内存地址,并不限于何种数据类型

最后更新于