new和malloc的区别,各自底层实现原理
1、new是操作符,malloc是函数。
2、new在调用的时候先分配内存,再调用构造函数,释放的时候调用析构函数;malloc没有构造函数和析构函数。
3、malloc需要给定申请空间的大小,返回指针需要强转;new会调用构造函数,不用指定内存大小,返回指针不需强转。
4.new可以被重载,malloc不行。
5、new分配内存更直接和安全。
6、new发生错误会抛出异常,malloc会返回NULL;
malloc底层实现:
当开辟的空间小于 128K 时,调用 brk()函数 ;当开辟的空间大于 128K 时,调用mmap()。malloc采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。
new底层实现:
1、创建一个新对象。
2、将构造函数的作用域赋值给这个新的对象(因此this指向了这个新的对象)
3、执行构造函数中的代码(为这个新对象添加属性)
4、返回一个新对象。
说说const和define的区别
const用于定义常量;而define用于定义宏,而宏也可以用于定义常量。都用于常量定义时,它们的区别有:
1、const生效于编译阶段;define生效于处理阶段。
2、const定义的常量,在C语言中是存储在内存中、需要额外的内存空间的;define定义的常量,运行时是直接的操作数,并不会存放在内存中
3、const定义的常量是带类型的;define定义的常量不带类型。因此define定义的常量不利于类型检查
C++中函数指针和指针函数的区别
定义:指针函数本质是一个函数,其返回值为指针。函数指针本质是一个指针,其指向一个函数
写法:
用例:
说说const int *a, int const *a, const int a, int *const a, const int *const a分别是什么,有什么特点
解析:
使用指针需要注意什么
1、定义指针时,先初始化为NULL;
2、用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存;
3、不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用
4、避免数字或指针的下标越界,特别要当心发生“多1”或者“少1”操作
5、动态内存的申请与释放必须配对,防止内存泄漏
6、用free或delete释放了内存之后,立即将指针设置为NULL,防止“野指针”
简述C++有几种传值方式,之间的区别是什么
值传递、引用传递、指针传递
1、值传递:形参即使在也函数体内值发生变化,不会影响实参的值。
2、引用传递:形参在函数体内值发生变化,会影响实参的值。
3、指针传递:在指针指向没有发生改变的前提下,形参在函数体内值发生变化,会影响实参的值
说明:
值传递用于对象时,整个对象会拷贝一个副本,这样效率低;而引用传递用于对象时,不发生拷贝行为,只是绑定对象,更高效;指针传递同理,但不如引用传递安全。