C++笔记(基础)动态内存管理 auto,decltype关键字
c++的动态内存管理
new :作用与malloc相仿
delete:作用与free相仿
对于内置类型new / delete / malloc / free可以混用。区别 :
1、new / delete 是C++中的运算符。malloc / free是函数。
2、malloc申请内存空间时,手动计算所需大小,new只需类型名,自动计算大小;
3、malloc申请的内存空间不会初始化,new可以初始化;
4、malloc的返回值为void*, 接收时必须强转,new不需要;
5、malloc申请内存空间失败时,返回的是NULL,使用时必须判空;
new申请内存空间失败时抛出异常,所 以要有捕获异常处理程序;
用法:
int* ptr = new int//(分配一个int类型的内存空间)
- ptr = 10;
int* arr = new int[5]//分配一个包含5个int元素的数组
delete ptr;
ptr = nullptr;
auto(自动类型推导)
auto a = 10;(a自动被推导成int)
但是必须对变量进行初始化,不然无法判断变量是什么类型
不能作为函数参数类型
不能推导数组类型(除非引用)
不能用于类的非静态成员变量
decltype(间接推导)
用法
int a = 10;
decltype(a)x;//x被推导成int
int add(int a, int b);//在main外面写这个函数
decltype(add(1, 2)) p;//在main里:推导函数的返回类型,p被推导成int
在模板编程中,decltype 非常有用。它可以帮助处理一些依赖于模板参数的类型。例如:
#include
template
auto add(T a, U b) -> decltype(a + b) {
return a + b;
}
int main() {
int num1 = 5;
double num2 = 3.5;
auto result = add(num1, num2); // result的类型根据a + b推导,这里为double
std::cout << result << std::endl;
return 0;
}
在上述模板函数 add 中,使用 decltype(a + b) 来指定函数的返回类型,
使得函数的返回类型能够根据传入参数的类型动态推导。
与 auto 的区别
auto 和 decltype 都用于类型推导,但有明显区别:
auto 根据初始化表达式的值来推导变量的类型,并且要求变量必须初始化。 例如 auto var = 10;var 的类型由 10 推导为 int。
decltype是根据表达式的形式来推导类型,不要求对变量进行初始化,它更侧重于获取表达式的类型信息。 例如 int x; decltype(x) y;y 的类型被推导为 int,即使 x 只是声明未初始化。