掩护打击内置菜单
104.75MB · 2025-11-22
C++进阶的“实用突破点”,内容选取高频用到的智能指针、右值引用、lambda表达式三大核心,用生活化类比+精简代码拆解。
核心痛点
手动管理 new/delete 容易漏删内存(内存泄漏)、重复删除(野指针崩溃),智能指针能自动释放资源,比裸指针安全10倍。
关键知识点(3种常用类型)
类型 用途 核心特性
unique_ptr 独占资源(不共享) 不能拷贝,只能移动
shared_ptr 共享资源(多指针访问) 引用计数,计数为0时释放
weak_ptr 解决循环引用 不增加引用计数,需锁验证
include <memory>
#include <iostream>
using namespace std;
int main() {
// 1. unique_ptr:独占所有权
unique_ptr<int> uptr = make_unique<int>(10); // 推荐用make_unique创建
cout << *uptr << endl; // 输出10
// unique_ptr<int> uptr2 = uptr; // 报错:不能拷贝
unique_ptr<int> uptr2 = move(uptr); // 正确:移动所有权
// 2. shared_ptr:共享所有权
shared_ptr<int> sptr = make_shared<int>(20);
shared_ptr<int> sptr2 = sptr; // 允许拷贝,引用计数变为2
cout << sptr.use_count() << endl; // 输出2(查看引用计数)
// 3. 无需手动delete!作用域结束自动释放
return 0;
}
核心痛点
传统拷贝(如 vector.push_back(大对象) )会复制整个数据,耗时耗内存;右值引用直接“偷”数据,零拷贝提速。
关键概念
#include <iostream>
#include <string>
using namespace std;
// 移动构造函数(右值引用实现)
class MyString {
private:
char* data;
public:
// 普通构造
MyString(const char* str) {
data = new char[strlen(str)+1];
strcpy(data, str);
cout << "普通构造:拷贝数据" << endl;
}
// 移动构造(&&表示右值引用)
MyString(MyString&& other) {
data = other.data; // 直接偷对方的资源
other.data = nullptr; // 对方置空,避免重复释放
cout << "移动构造:零拷贝偷数据" << endl;
}
~MyString() { delete[] data; }
};
int main() {
MyString s1("hello"); // 普通构造:拷贝数据
// 临时对象是右值,触发移动构造
MyString s2 = MyString("world"); // 移动构造:零拷贝偷数据
return 0;
}
核心痛点
写短小的函数(如排序规则、回调函数)时,无需单独定义函数,lambda直接内嵌,代码更简洁。
[捕获列表](参数列表) -> 返回值类型 { 函数体 }
// 捕获列表:获取外部变量([]空捕获,[=]值捕获,[&]引用捕获)
// 返回值类型可省略(编译器自动推导)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> nums = {3, 1, 4, 1, 5};
// 1. 排序:用lambda代替单独写比较函数
sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b; // 降序排序(捕获列表为空,无需外部变量)
});
// 2. 遍历:捕获外部变量cout,输出结果
for_each(nums.begin(), nums.end(), [](int x) {
cout << x << " "; // 输出:5 4 3 1 1
});
return 0;
}
总结:3个技巧的核心价值
1. 智能指针:告别内存泄漏,新手也能写安全代码;
2. 右值引用:提升性能,尤其处理大对象/容器时;
3. lambda表达式:简化代码,短小逻辑不用单独定义函数。