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