临沂网站改版,学习网首页,给网站公司做网站,手机网站设计公司哪家好智能指针 智能指针: C11引入了四种智能指针: auto_ptr(已弃用)、unique_ptr、shared_ptr和weak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。 shared_ptr: 自定义删除器。 shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向…智能指针 智能指针: C11引入了四种智能指针: auto_ptr(已弃用)、unique_ptr、shared_ptr和weak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。 shared_ptr: 自定义删除器。 shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向同一个对象,只有最后一个shared_ptr被销毁时,该对象才会被销毁。使用shared_ptr要注意的问题 不要用一个原始指针初始化多个shared_ptr不要在函数实参中创建shared_ptr因为编译器差异没有明确指定参数顺序。 function(shared_ptrint(new int), g()); //有缺陷 通过shared_from_this()返回this指针。 解决引发两次析构问题底层就是使用weak_ptr class A: public std::enable_shared_from_thisA
shared_ptrAGetSelf()
{//return shared_ptrA(this); // 不要这么做return shared_from_this(); // 正确方式
} 避免循环引用 A:shared_ptr B:shared_ptr
问题A-B B-A 这种情况会导致内存泄漏析构只进行-1次引用计数。解决A:shared_ptr B:weak_ptr 即可 unique_ptr: unique_ptr是一种独占式的智能指针,不允许复制,但可以移动。它适用于管理应该有单一所有者的资源。讨论了unique_ptr和shared_ptr之间的差异,如数组支持和自定义删除器。使用shared_ptr要注意的问题 初始化灾难。new T会造成重复类型声明。代码可读性差 unique_ptrT my_ptr(new T);
unique_ptrT my_other_ptr my_ptr; // 报错不能复制// 方法1重复类型不推荐
std::unique_ptrComplexObject obj1(new ComplexObject(10, example)
);// 方法2避免重复推荐
auto obj2 std::make_uniqueComplexObject(10, example);// 重复类型声明的潜在问题
// - 编译器需要多次处理相同类型
// - 增加编译时间
// - 可能导致目标代码膨胀 数组支持。 std::unique_ptrint [] ptr(new int[10]);ptr[9] 9;std::shared_ptrint [] ptr2(new int[10]); // 这个是不合法的 删除器区别。需要指定删除器类型 std::shared_ptrint ptr3(new int(1), [](int *p){delete p;}); // 正确
std::unique_ptrint ptr4(new int(1), [](int *p){delete p;}); // 错误// 方法2自定义更复杂的分配
auto customDeleter [](int* p) { // 可以添加额外的清理逻辑delete[] p;
};auto ptr2 std::unique_ptrint[], decltype(customDeleter)(new int[5](), customDeleter
); weak_ptr: weak_ptr是一种非拥有式的智能指针,用于观察由shared_ptr管理的对象的生命周期。它用于打破循环引用,防止内存泄漏。涵盖了基本用法、将this指针返回为weak_ptr以及解决循环引用问题。 举个例子监视某内存的释放。 std::weak_ptrint gw;void f(){if(gw.expired()) {cout gw无效,资源已释放;}else {auto spt gw.lock();cout gw有效, *spt *spt endl;}}int main(){{auto sp atd::make_sharedint(42);gw sp;f();}f();return 0;} weak_ptr使用注意事项 weak_ptr在使用前需要检查合法性。在使用wp前需要调用wp.expired()函数判断一下 智能指针安全性: 智能指针通常是安全的,但在多线程访问同一个shared_ptr对象时需要考虑线程安全性。当每个线程有自己的shared_ptr实例时,只要底层数据相同就是安全的。
右值引用和移动语义
关键点总结 左值可取地址的持久对象右值临时对象不可取地址。 比如临时变量字面量常量 右值的关键特征 不可取地址只能出现在赋值表达式右侧没有持久的内存位置可以被移动但不能被修改通常是临时的、短暂的对象右值引用可以延长临时对象生命周期std::move 无条件地将对象转换为右值移动语义避免不必要的深拷贝万能引用可以接受左值和右值 templatetypename T
// 引用折叠规则
// T - T
// T - T
// T - T
// T - T
void forwardingFunc(T arg) {// arg 可能是左值引用或右值引用someFunc(std::forwardT(arg));
}void testUniversalRef() {int x 10;forwardingFunc(x); // T 推导为 intforwardingFunc(10); // T 推导为 int
} C11 在性能上做了很大的改进最大程度减少了内存移动和复制通过右值引用、 forward、 emplace 和一些无序容器我们可以大幅度改进程序性能。 右值引用仅仅是通过改变资源的所有者来避免内存的拷贝能大幅度提高性能。 forward 能根据参数的实际类型转发给正确的函数。 emplace 系列函数通过直接构造对象的方式避免了内存的拷贝和移动。 无序容器在插入元素时不排序提高了插入效率不过对于自定义 key 时需要提供 hash 函数和比 较函数 匿名函数lambda 迭代器
使用一个 iterator 对象来指向一个可以修改的容器元素使用一个 const_iterator 对象来指向一个不能 修改 的容器元素。 每种容器所支持的迭代器类型决定了这种容器是否可以在指定的 STL 算 法中使用。
const只能读reverser是反向。正常使用都是iterator。 详细了解
C 参考手册 - cppreference.com
C面试常见题目7_STL之map与unordered_map红黑树VS哈希表_map 和unordermap区别面试-CSDN博客 学习资料分享
0voice · GitHub