C++

来源:互联网 发布:汽车防盗芯片编程器 编辑:程序博客网 时间:2024/04/28 22:24

1.malloc/free和new/delete的区别

malloc/free是C语言的标准库函数,new/delete是C++的运算符。

由于malloc/free是库函数而不是运算符,不在编译器控制权限之内。

对于用户自定义的对象而言,用malloc/free无法满足动态管理对象的要求

new是类型安全的,malloc不是。int a-new float[2] 是通不过编译的,new内置了sizeof类型转换和类型安全检查功能。而malloc返回类型是void*,malloc只负责申请空间。

对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作,malloc则没有,calloc初始化,内卡为0.对于内部数据类型需要圆括号new才执行初始化工作。string属于非内部数据类型。int arr-new[10]IMC有初始化,int arr-new int [10];初始化为0;

2.多进程与多线程编程的区别

子进程会复制父进程的数据空间、堆、?,而创建线程则不会发生复制,变量在线程之间都是共享的。

对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访问时,如果要保证线程安全,则必须通过加锁的方式。

3.线程安全和可重入的关系

可重入的函数一定是线程安全的,但反过来不一定成立。

线程安全:一个函数被称为安全的,当且仅当被个多个并发线程反复调用时,它会一直产生正确的结果。

可重入:程序执行某个函数A时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理的执行过程中,又恰恰也会进入刚刚执行的函数A。

要确保函数可重入,需满足一下几个条件:

1、不在函数内部使用静态或全局数据

2、不返回静态或全局数据,所有数据由函数的调用者提供

3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据