this
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this的作用域是在类的内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。
this是指相当前对象的指针,哪个对象调用包含this指针的函数,this指向哪个对象
this一般在构造函数中使用,用来区分成员变量和参数
class A{
int num;
public:
//this区分成员变量和参数
A(int num){
this->num = num;
}
}
int main(){
A p(1);
}
new&&delete
#include<iostream>
#include<vector>
using namespace std;
class A{
public:
int *p = nullptr;
A(){}
A(int n){
p = new int[n];
}
~A(){
if(p) delete[]p;
}
}
int main(){
int *i = new int;//在堆区申请一个int类型的内存,值为随机值
delete i;
int *i = new int(3);//在堆区申请一个int类型的内存,值为3
delete i;
int *i = new int[3];//在堆区申请一个int类型的数组,三个元素为随机值。
delete[] i;
int *i = new int[3]{1,2,3};//在堆区申请一个int类型的数组,三个元素为1 2 3。
delete[] i;
A *a = new A();//在堆区创建A类型对象调用无参构造
delete a;
A *a1 = new A(3);
delete a1;//delete 会先调用析构函数在调用free()
A *a1 = new A[3];//在堆区创建一个A类型的数组,调用无参构造
delete[] a1;
A *a1 = new A[3]{A(),A(2),A(3)};//在堆区创建一个A类型的数组,调用无参构造
delete[] a1;
}
new和malloc的区别
- new/delete是c++的运算符,编译时需要添加参数,malloc/free是c语言中的函数,编译时需要头文件的支持
- new返回指定类型的指针,可自动计算出大小。malloc需我们计算字节数,返回后强型转换为实际类型的指针
- malloc只管分配内存,不能初始化,new可对得到的内存进行初始化
- new可调用构造函数,malloc不能
- delete可调用析构函数,free不能
- new/delete都可被重载,malloc/free不能
- new分配内存失败时会抛出异常,而malloc分配失败会返回null
try {
int* ptr = new int[1000000000000]; // 尝试分配非常大的数组
} catch (const std::bad_alloc& e) {
// 内存分配失败,处理异常
std::cout << "内存分配失败: " << e.what() << std::endl;
}
int* ptr = (int*)malloc(1000000000000 * sizeof(int)); // 尝试分配非常大的数组
if (ptr == NULL) {
// 内存分配失败,处理情况
std::cout << "内存分配失败" << std::endl;
} else {
// 内存分配成功,继续使用指针
// ...
}
new malloc free delete可以混合使用吗
- 对于基本类型而言,根据需要new和malloc可以混用,new[]和malloc可以混用,delete、delete[]和free可以混用
- 对于构造函数没有作用的类,new和malloc可以混用。
- 对于没有显示定义析构函数的类,delete、delete[]和free可以混用
- 对于显示定义析构函数的类,delete[]和new[]必须配套使用,delete和free如果想混用free需要显示调用解析函数