C++基础之——new&&delete

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需要显示调用解析函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coke_3.2.2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值