02c++零碎语法

c++语法知识

目录

1.内联函数请添加图片描述

2.extern关键字

重载输出请添加图片描述

3.shared_ptr智能指针

3.1定义

std::shared_ptr 是 C++ 中一种智能指针,用于自动管理动态分配的内存。它通过引用计数机制确保当最后一个 shared_ptr 指向某个对象时,该对象会被自动销毁。这使得 shared_ptr 成为管理共享所有权资源的理想选择。

3.2 不使用智能指针

一个简单的类 MyObject,我们创建了两个对象,并且在两个不同的函数中使用它们。在每个函数结束后,我们需要确保释放这些对象所占用的内存。

#include <iostream>

class MyObject {
public:
    MyObject() { std::cout << "MyObject created.\n"; }
    ~MyObject() { std::cout << "MyObject destroyed.\n"; }
    void doSomething() { std::cout << "MyObject is doing something.\n"; }
};

void useObject(MyObject* obj) {
    if (obj) {
        obj->doSomething();
    }
    // 需要在这里释放对象,以避免内存泄漏
    delete obj;
}

int main() {
    {
        MyObject* obj1 = new MyObject(); // 创建对象
        useObject(obj1); // 传递对象给函数使用,并期望函数释放它
    } // obj1 的作用域结束,如果 useObject 没有释放它,将发生内存泄漏

    {
        MyObject* obj2 = new MyObject(); // 创建另一个对象
        obj2->doSomething(); // 直接在 main 中使用对象
        // 需要在这里释放对象,以避免内存泄漏
        delete obj2;
    } // obj2 的作用域结束,如果 main 没有释放它,将发生内存泄漏

    return 0;
}

3.3使用智能指针

#include <iostream>
#include <memory>

class MyObject {
public:
    MyObject() { std::cout << "MyObject created.\n"; }
    ~MyObject() { std::cout << "MyObject destroyed.\n"; }
    void doSomething() { std::cout << "MyObject is doing something.\n"; }
};

void useObject(std::unique_ptr<MyObject> obj) {
    if (obj) {
        obj->doSomething();
    }
    // 不需要手动释放对象,unique_ptr 会自动释放
}

int main() {
    {
        auto obj1 = std::make_unique<MyObject>(); // 创建对象,std::make_unique 是 C++17 引入的便利函数
        useObject(std::move(obj1)); // 将 obj1 移动到 useObject 函数中,转移所有权
        // obj1 的作用域结束,此时 obj1 为空,不再拥有对象的所有权
    }
    // obj2 的作用域结束,对象自动被销毁

    {
        auto obj2 = std::make_unique<MyObject>(); // 创建另一个对象
        obj2->doSomething(); // 直接在 main 中使用对象
        // 不需要手动释放 obj2,其作用域结束时自动释放
    }
    // obj2 的作用域结束,对象自动被销毁

    return 0;
}

3.3.1自定义删除器(custom deleter)

shared_ptr<AVFrame> AudioResampler::allocOutFrame(const int nb_samples)
请添加图片描述

3.4 内存泄漏影响

[内存泄漏会导致什么问题] https://blog.csdn.net/m0_63102097/article/details/138622635

4.delete

 // 删除拷贝构造函数
    AudioPlayer(const AudioPlayer&) = delete;

    // 删除拷贝赋值运算符
    AudioPlayer& operator=(const AudioPlayer&) = delete;

int main() {
    // 创建一个 AudioPlayer 对象
    AudioPlayer player1;

    // 尝试创建一个 AudioPlayer 对象的副本将导致编译错误
    // AudioPlayer player2 = player1; // 这将无法编译

    // 尝试通过赋值操作复制对象也将导致编译错误
    // AudioPlayer player3;
    // player3 = player1; // 这将无法编译

    return 0;
}
这有助于保护类的资源不被错误地共享或管理。这种模式特别适用于那些需要管理独占资源或具有唯一性的类

5.|=(逻辑或赋值)

累积多个函数调用的错误状态
请添加图片描述
请添加图片描述

6. 指针数组与数组指针的释放问题

起因:
![请添加图片描述](https://img-blog.csdnimg.cn/direct/4486a89e63ce4d8796fcca81fe797cfd.png

6.1指针数组

请添加图片描述

6.2数组指针

请添加图片描述

6.3delete[]问题

请添加图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值