1.malloc、free和new、delete的区别:
1、.malloc、free是函数,new、delete是运算符。
2、malloc不会调用构造函数,new可以调用构造函数。
3、malloc开辟失败返回NULL,new失败会捕捉异常。
4、malloc不会自动计算类型大小,且返回void*的指针,需要强制类型转换,new可以计算类型大小同时不用强制类型转换。
5、new的底层逻辑是operator new 和 调用构造函数,operator new会开辟空间和捕捉异常。
6、malloc、free只是开辟、销毁空间,new在开辟空间后会调用构造函数,delete会先调用析构函数在释放开辟的空间。
2.C、C++的内存分布:
1、内存空间被划分为栈区、堆区、静态区、常量区,划分的目的是方便管理。
2、用字符数组接受一个字符串,对数组名解引用的数据是存放在栈区上的。一个字符指针指向一个字符串,对指针解引用的数据存放位置是字符串的存放位置(若字符串是常量字符串则存放在静态区)
3、用const修饰的变量存放位置与const无关,即可以忽略const再判断。(并非有const就在静态区)
3.new的异常检查:
在try后的大括号内进行异常检查,如果有异常则不会继续执行下一条指令,而是直接跳转到catch去执行,此处"e.what()"是打印异常原因。同时,如果try内没有异常的代码,则会跳过catch和catch后的大括号,去执行别的语句。
4.cout打印字符指针:
在C++中,除了字符类型的指针外,别的都是打印指针存放的内容,即地址。但字符指针默认是打印所指向的字符串的内容,直至遇到"\0"才停止。如果不希望打印字符串而是打印地址,可以强制类型转换,或者使用printf。
5.delete底层是先析构在进行free,对于内置类型数组,默认析构对内置不处理,因此用delete无影响(delete后面的"[]"在vs中的作用是让指针提前四个字节,这四个字节是保存数组的长度,如果没有"[]"则会少摧毁四个字节,就会报错)。
6.new创建数组会调用N次构造函数,delete会调用N次析构函数。
7.构造函数不能显示调用,析构函数可以显示调用。如果希望单独调用构造函数,可以new(指针)类名(参数列表),这就是显示调用构造函数。
8.模版:
关键词:template
用法:template<class t1,class t2,...>
函数模版:
1、模版定义的是类型,即上述的t1、t2等都是类型名。
2、编译器用模版生成对应的函数。
3、本质上是编译器根据模版对应生成函数(根据实参决定t)(函数模版的实例化)
4.如果一个t对应两个不同类型的函数,则会报错。解决方法:1.强制类型转换其中一个。2、显示实例化。 函数名<类型>+()。
类模版:
1、与函数模版的不同之处:编译器无法根据实参推断t,因此需要显示实例化。
用法:类名<类型>对象名