当前位置: 首页 > news >正文

杭州建设网站公司网站危机公关处理五大原则

杭州建设网站公司网站,危机公关处理五大原则,郑州短视频拍摄制作,百度做的网站 如果不做推广了 网站还保留吗C语言基础与核心特性 1. C 基本概念与语法 *问题#xff1a; C 和 C 的区别类型#xff1f; 特性C 语言C编程范式过程式编程支持面向对象、泛型、函数式编程标准库标准库功能有限强大的 STL 库 (容器、算法等)函数特性不支持函数重载支持函数重载和默认参数内存管理malloc/fr…C语言基础与核心特性 1. C 基本概念与语法 *问题 C 和 C 的区别类型 特性C 语言C编程范式过程式编程支持面向对象、泛型、函数式编程标准库标准库功能有限强大的 STL 库 (容器、算法等)函数特性不支持函数重载支持函数重载和默认参数内存管理malloc/freenew/delete 运算符类型安全弱类型检查更强的类型检查和类型转换机制异常处理无内置异常处理try/catch 异常处理机制结构体/类结构体仅含数据成员类包含成员函数和访问控制 关键区别示例 // C 特有特性示例 class Rectangle { // 类定义 private:int width, height; public:Rectangle(int w, int h) : width(w), height(h) {}int area() const { return width * height; } // 成员函数 };template typename T // 模板函数 T max(T a, T b) {return a b ? a : b; }const关键字的作用和作用常量、常量指针、指向常量的指针、常量成员函数 用法示例作用说明常量变量const int MAX 100;定义不可修改的常量常量指针int* const ptr x;指针本身不可修改指向固定指向常量的指针const int* ptr x;指向的数据不可修改常量成员函数int get() const { ... }承诺不修改对象状态常量引用void func(const string s);避免拷贝且防止修改// 常量成员函数示例 class Circle {double radius; public:double getRadius() const { // 常量成员函数return radius; // 不能修改成员变量} }; static关键字的作用和作用静态变量、静态函数、静态成员变量、成员变量 上下文作用示例局部变量延长生命周期整个程序运行void func() { static int count; }全局变量/函数限制作用域为当前文件static int internalVar;类静态成员变量类所有实例共享class A { static int count; }类静态成员函数无 this 指针访问静态成员class A { static void f(); }// 静态成员示例 class Counter {static int count; // 声明 public:Counter() { count; }static int getCount() { return count; } }; int Counter::count 0; // 定义初始化volatile关键字的作用 作用防止编译器优化告知编译器变量可能被外部修改使用场景硬件寄存器、多线程共享变量示例volatile bool flag false; inline关键字的作用什么情况下函数会被内联auto 作用建议编译器内联展开函数体消除函数调用开销 内联条件 函数体简单通常不超过10行无递归/循环复杂结构非虚函数 示例 inline int square(int x) { return x * x; }decltype关键字的作用及使用场景 作用查询表达式的类型 使用场景 int x 10; decltype(x) y 20; // y的类型为inttemplate typename T, typename U auto add(T t, U u) - decltype(t u) {return t u; }关键字的作用 作用类别说明C 示例程序控制控制代码执行流程分支、循环、跳转if, for, while, switch数据类型定义声明变量、函数或对象的数据类型int, char, bool, class内存管理管理内存分配与释放new, delete访问控制限制类成员的访问权限public, private, protected修饰符修改变量/函数的行为常量性、静态性等const, static, volatile高级特性支持支持面向对象继承、多态、泛型编程等virtual, template, typename异常处理处理程序运行时错误try, catch, throw 头文件守卫包括 Guards的作用和实现方式 // myheader.h #ifndef MYHEADER_H // 如果没有定义MYHEADER_H #define MYHEADER_H // 则定义它// 头文件内容...#endif // 结束命名空间Namespace的作用和使用 namespace MyLib {void func();class MyClass {}; }// 使用方式 using namespace MyLib; // 引入整个命名空间 using MyLib::func; // 引入特定符号 MyLib::MyClass obj; // 完全限定名方式作用域风险using namespace std;引入整个命名空间可能引起名称冲突using std::cout;引入特定符号风险较低 声明和指令的区别 特性声明Declaration指令Instruction功能提供信息定义结构或实体执行具体操作改变程序状态是否执行不执行具体操作执行具体操作语法结构通常以特定语法形式出现如int a;包含操作符和操作数如a 5;示例int a;变量声明void func();函数声明a 5;赋值指令b a 3;算术指令 C 的基本数据类型及其大小 类型32位系统大小64位系统大小范围bool1 byte1 bytetrue/falsechar1 byte1 byte-128~127 或 0~255short2 bytes2 bytes-32,768~32,767int4 bytes4 bytes-231~231-1long4 bytes8 bytes系统相关long long8 bytes8 bytes-263~263-1float4 bytes4 bytes±3.4e-38~±3.4e38double8 bytes8 bytes±1.7e-308~±1.7e308long double8-16 bytes16 bytes大于 double 的范围 类型转换隐式转换、静态转换nullptr、动态转换、常量、重新解释转换及其使用场景和注意事项 C 四种强制类型转换 转换类型语法使用场景风险静态转换static_casttype()基本类型转换、基类指针向下转换运行时无检查动态转换dynamic_casttype()多态类型安全向下转换需要 RTTI性能开销常量转换const_casttype()移除 const/volatile 限定符可能引发未定义行为重新解释转换reinterpret_casttype()低层二进制重新解释高度危险平台相关// 静态转换常用安全转换 double d 3.14; int i static_castint(d); // i3// 动态转换多态类型检查 Base* b new Derived; Derived* d dynamic_castDerived*(b); // 成功// 常量转换移除 const const int c 10; int* p const_castint*(c); // 谨慎使用// 重新解释转换指针转整数 int* ip new int(65); char* cp reinterpret_castchar*(ip);2. 针对对象编程OOP特性 *问题类型 OOP 的三大调用时机是什么 如何理解封装、继承、多态 封装将数据与操作数据的方法绑定隐藏实现细节通过 private/protected 控制访问。继承允许派生类复用基类的属性和方法class Derived : public Base。多态同一接口在不同上下文中表现不同行为通过虚函数实现运行时多态。 类Class和对象Object的区别 类对象抽象蓝图数据类型定义类的具体实例占用内存实体不占用内存运行时在堆/栈分配内存例class Car { ... }例Car myCar; 构造函数和构造函数 默认构造函数、拷贝构造函数、移动构造函数、赋值操作重载、移动赋值特性重载“大五或大六” 各自的调用时机 为什么需要拷贝构造函数和赋值重载 函数类型声明示例调用时机默认构造函数ClassName();创建无参对象ClassName obj;拷贝构造函数ClassName(const ClassName other);拷贝初始化ClassName obj2 obj1;移动构造函数ClassName(ClassName other);移动资源ClassName obj2 std::move(obj1);拷贝赋值运算符ClassName operator(const ClassName);赋值obj2 obj1;移动赋值运算符ClassName operator(ClassName);移动赋值obj2 std::move(obj1); 拷贝深和浅拷贝的区别如何实现深拷贝 默认浅拷贝仅复制指针不复制资源需自定义深拷贝避免重复释放资源。 深拷贝实现 class String { char* data; public: // 深拷贝构造函数 String(const String other) { data new char[strlen(other.data) 1]; strcpy(data, other.data); } // 深拷贝赋值 String operator(const String other) { if (this ! other) { delete[] data; data new char[strlen(other.data) 1]; strcpy(data, other.data); } return *this; } }; 什么时候需要自定义这些函数三/五/零规则 三/五/零法则 三法则需自定义析构函数时通常需同时定义拷贝构造和拷贝赋值。五法则C11增加移动构造和移动赋值。零法则不管理资源时依赖编译器默认实现。 虚解析构造函数的作用 作用确保通过基类指针删除派生类对象时调用完整的析构链。 class Base { public: virtual ~Base() {} // 虚析构 }; class Derived : public Base {}; Base* ptr new Derived(); delete ptr; // 正确调用 Derived 的析构函数 继承 公继承、保护继承、本土继承的区别 继承类型基类 public 成员在派生类中的访问权限publicpublicprotectedprotectedprivateprivate 多继承的优缺点菱形继承问题及解决方案虚继承 菱形继承 #mermaid-svg-ypIaLdQKTuhiWLt2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ypIaLdQKTuhiWLt2 .error-icon{fill:#552222;}#mermaid-svg-ypIaLdQKTuhiWLt2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ypIaLdQKTuhiWLt2 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ypIaLdQKTuhiWLt2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ypIaLdQKTuhiWLt2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ypIaLdQKTuhiWLt2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ypIaLdQKTuhiWLt2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ypIaLdQKTuhiWLt2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ypIaLdQKTuhiWLt2 .marker.cross{stroke:#333333;}#mermaid-svg-ypIaLdQKTuhiWLt2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ypIaLdQKTuhiWLt2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ypIaLdQKTuhiWLt2 .cluster-label text{fill:#333;}#mermaid-svg-ypIaLdQKTuhiWLt2 .cluster-label span{color:#333;}#mermaid-svg-ypIaLdQKTuhiWLt2 .label text,#mermaid-svg-ypIaLdQKTuhiWLt2 span{fill:#333;color:#333;}#mermaid-svg-ypIaLdQKTuhiWLt2 .node rect,#mermaid-svg-ypIaLdQKTuhiWLt2 .node circle,#mermaid-svg-ypIaLdQKTuhiWLt2 .node ellipse,#mermaid-svg-ypIaLdQKTuhiWLt2 .node polygon,#mermaid-svg-ypIaLdQKTuhiWLt2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ypIaLdQKTuhiWLt2 .node .label{text-align:center;}#mermaid-svg-ypIaLdQKTuhiWLt2 .node.clickable{cursor:pointer;}#mermaid-svg-ypIaLdQKTuhiWLt2 .arrowheadPath{fill:#333333;}#mermaid-svg-ypIaLdQKTuhiWLt2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ypIaLdQKTuhiWLt2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ypIaLdQKTuhiWLt2 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ypIaLdQKTuhiWLt2 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ypIaLdQKTuhiWLt2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ypIaLdQKTuhiWLt2 .cluster text{fill:#333;}#mermaid-svg-ypIaLdQKTuhiWLt2 .cluster span{color:#333;}#mermaid-svg-ypIaLdQKTuhiWLt2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ypIaLdQKTuhiWLt2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Base Derived1 Derived2 Final 问题Final 类包含两份 Base 子对象二义性。解决方案虚继承class B : virtual public A。 虚继承的原理 虚继承原理虚基类子对象被共享通过虚基类表vtable偏移访问。 多态 什么是多态 实现多态的方式编译时多态、运行时多态 编译时多态函数重载、模板静态绑定。 运行时多态虚函数动态绑定。 class Shape { public: virtual void draw() 0; // 纯虚函数 → 抽象类 }; class Circle : public Shape { public: void draw() override { /* 实现 */ } // 重写虚函数 }; Shape* s new Circle(); s-draw(); // 调用 Circle::draw() 虚函数virtual纯虚函数0抽象类 概念是否可实例化是否含函数体派生类强制重写普通虚函数✅✅❌纯虚函数❌❌✅抽象类❌可含其他函数实现必须实现所有纯虚函数 关键记忆点 虚函数virtual 可选重写 → 支持多态纯虚函数virtual ... 0 → 强制重写抽象类含纯虚函数 → 定义接口规范 虚函数表vtable和虚指针vptr的原理 每个含虚函数的类有一个 vtable存储函数指针数组。对象隐含 vptr 指针指向 vtable运行时通过 vptr 定位实际函数。 重载Overload、覆盖/调用Override、隐藏Hide的区别 类型作用域关键特征重载同一类/命名空间函数名相同参数列表不同覆盖基类与派生类虚函数 相同签名override隐藏基类与派生类非虚函数 同名屏蔽基类函数 友元函数和友元类作用和使用场景打破封装性 作用允许访问类的 private/protected 成员。 class A { private: int secret; friend class B; // 友元类 friend void func(); // 友元函数 }; 打破封装性谨慎使用仅用于紧密协作的类/函数。 接口Interface在 C 中如何实现 C 通过纯虚抽象类实现接口 class IPrintable { public: virtual void print() const 0; virtual ~IPrintable() default; }; class Document : public IPrintable { public: void print() const override { ... } }; 3. 模板Templates *问题类型 函数模板和类模板的定义与使用 定义与使用 类型定义使用示例函数模板泛型函数操作不同类型数据cppbrtemplate typename TbrT max(T a, T b) { return a b ? a : b; }br类模板泛型类成员数据类型/方法可参数化cppbrtemplate typename Tbrclass Stack {br T data[100];brpublic:br void push(T item);br};br调用方式// 函数模板显式实例化 cout maxint(3, 5); // 输出 5 // 类模板实例化 Stackstring s; // 创建字符串栈 s.push(Hello); 模板的实例化过程 编译器处理流程 解析模板声明检查基本语法延迟实例化直到使用具体类型时才生成代码生成特化版本为每个类型参数创建具体类/函数 #mermaid-svg-bADVDmkXivo9WAL5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bADVDmkXivo9WAL5 .error-icon{fill:#552222;}#mermaid-svg-bADVDmkXivo9WAL5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bADVDmkXivo9WAL5 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-bADVDmkXivo9WAL5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bADVDmkXivo9WAL5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bADVDmkXivo9WAL5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bADVDmkXivo9WAL5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bADVDmkXivo9WAL5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bADVDmkXivo9WAL5 .marker.cross{stroke:#333333;}#mermaid-svg-bADVDmkXivo9WAL5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bADVDmkXivo9WAL5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bADVDmkXivo9WAL5 .cluster-label text{fill:#333;}#mermaid-svg-bADVDmkXivo9WAL5 .cluster-label span{color:#333;}#mermaid-svg-bADVDmkXivo9WAL5 .label text,#mermaid-svg-bADVDmkXivo9WAL5 span{fill:#333;color:#333;}#mermaid-svg-bADVDmkXivo9WAL5 .node rect,#mermaid-svg-bADVDmkXivo9WAL5 .node circle,#mermaid-svg-bADVDmkXivo9WAL5 .node ellipse,#mermaid-svg-bADVDmkXivo9WAL5 .node polygon,#mermaid-svg-bADVDmkXivo9WAL5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bADVDmkXivo9WAL5 .node .label{text-align:center;}#mermaid-svg-bADVDmkXivo9WAL5 .node.clickable{cursor:pointer;}#mermaid-svg-bADVDmkXivo9WAL5 .arrowheadPath{fill:#333333;}#mermaid-svg-bADVDmkXivo9WAL5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bADVDmkXivo9WAL5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bADVDmkXivo9WAL5 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-bADVDmkXivo9WAL5 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-bADVDmkXivo9WAL5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bADVDmkXivo9WAL5 .cluster text{fill:#333;}#mermaid-svg-bADVDmkXivo9WAL5 .cluster span{color:#333;}#mermaid-svg-bADVDmkXivo9WAL5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bADVDmkXivo9WAL5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} int double 模板代码 使用模板 生成 int 版本机器码 生成 double 版本机器码 关键特性 隐式实例化编译器自动推导类型如 max(3.14, 2.71) → double 版本显式实例化手动指定类型如 maxfloat(...)编译期开销每用一新类型实例化代码体积增大 模板特化Template Specialization和偏特化Partial Specialization 特化类型 类型作用示例全特化为特定类型提供定制实现cppbrtemplate brconst char* max(const char* a, const char* b) {br return strcmp(a, b) 0 ? a : b;br}br偏特化为部分参数特化仅类模板cppbrtemplate typename Tbrclass StackT* { // 指针类型的特化br // 特殊实现br};br应用场景 优化特定类型性能如 char* 避免深拷贝特殊类型处理如指针、bool 等 为什么模板的定义实现通常放在头文件中 根本原因模板是编译期生成代码的机制 分离编译问题 编译器在实例化模板时需要看到完整定义若声明/定义分离.hpp/.cpp链接器无法找到具体实现 解决方案 推荐方法模板定义直接写在头文件.hpp 显式实例化需列出所有可能类型 // stack.cpp template class Stackint; // 显式实例化 int 版本 template class Stackfloat; // 显式实例化 float 版本 export 关键字C11 支持有限不推荐 模板元编程Template Metaprogramming是什么有什么应用 定义在编译期执行计算的编程技术图灵完备 核心机制 模板特化 递归实例化类型推导typedef、using值计算enum、constexpr 经典示例编译期阶乘计算 template int N struct Factorial { enum { value N * FactorialN-1::value }; }; template struct Factorial0 { // 特化终止递归 enum { value 1 }; }; // 编译期计算结果 constexpr int fact5 Factorial5::value; // 等于 120 核心应用 领域用途类型安全容器std::vectorT, std::mapK,V编译期计算数学运算、单位转换如 std::ratio静态多态CRTP奇异递归模板模式条件编译std::enable_if, 特性检查traits高性能库Eigen矩阵运算, Boost.MPL优势与代价 优势代价⚡ 零运行时开销 编译时间显著增加️ 更强的类型安全 代码可读性降低 生成高度优化的专用代码 调试困难编译器错误复杂 重要原则优先用 constexpr 函数替代 TMPC11 起除非需要类型操作或编译期分支。 4. 异常处理异常处理 *问题类型 try, catch,throw关键字 关键字作用示例throw抛出异常对象throw std::runtime_error(Error!);try定义可能抛出异常的代码块try { risky_operation(); }catch捕获并处理特定类型异常catch (const std::exception e) { ... } 异常处理的流程 #mermaid-svg-mlPBm4Fh7LPdeYKp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mlPBm4Fh7LPdeYKp .error-icon{fill:#552222;}#mermaid-svg-mlPBm4Fh7LPdeYKp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mlPBm4Fh7LPdeYKp .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-mlPBm4Fh7LPdeYKp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mlPBm4Fh7LPdeYKp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mlPBm4Fh7LPdeYKp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mlPBm4Fh7LPdeYKp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mlPBm4Fh7LPdeYKp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mlPBm4Fh7LPdeYKp .marker.cross{stroke:#333333;}#mermaid-svg-mlPBm4Fh7LPdeYKp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mlPBm4Fh7LPdeYKp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mlPBm4Fh7LPdeYKp .cluster-label text{fill:#333;}#mermaid-svg-mlPBm4Fh7LPdeYKp .cluster-label span{color:#333;}#mermaid-svg-mlPBm4Fh7LPdeYKp .label text,#mermaid-svg-mlPBm4Fh7LPdeYKp span{fill:#333;color:#333;}#mermaid-svg-mlPBm4Fh7LPdeYKp .node rect,#mermaid-svg-mlPBm4Fh7LPdeYKp .node circle,#mermaid-svg-mlPBm4Fh7LPdeYKp .node ellipse,#mermaid-svg-mlPBm4Fh7LPdeYKp .node polygon,#mermaid-svg-mlPBm4Fh7LPdeYKp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mlPBm4Fh7LPdeYKp .node .label{text-align:center;}#mermaid-svg-mlPBm4Fh7LPdeYKp .node.clickable{cursor:pointer;}#mermaid-svg-mlPBm4Fh7LPdeYKp .arrowheadPath{fill:#333333;}#mermaid-svg-mlPBm4Fh7LPdeYKp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mlPBm4Fh7LPdeYKp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mlPBm4Fh7LPdeYKp .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-mlPBm4Fh7LPdeYKp .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-mlPBm4Fh7LPdeYKp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mlPBm4Fh7LPdeYKp .cluster text{fill:#333;}#mermaid-svg-mlPBm4Fh7LPdeYKp .cluster span{color:#333;}#mermaid-svg-mlPBm4Fh7LPdeYKp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mlPBm4Fh7LPdeYKp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否 是 是 否 执行 try 块代码 是否抛出异常? 正常执行后续代码 销毁 try 块局部对象 匹配 catch 块 匹配成功? 执行 catch 块处理 栈展开至外层 try 继续执行后续代码 栈展开Stack Unwinding 过程 异常抛出后从当前函数开始逆向回溯调用栈每层栈帧的局部对象自动调用析构函数直到找到匹配的 catch 块或程序终止 关键点 仅析构完全构造的对象内置类型指针等不会自动释放资源 → 需 RAII 管理 异常安全异常安全的级别Basic, Strong, Nothrowguarantee 级别描述基本保证 (Basic)不泄露资源对象保持有效状态但内容可能改变强保证 (Strong)操作要么完全成功要么回滚到操作前状态事务语义不抛保证 (Nothrow)承诺不抛出任何异常如 swap()、析构函数 实现强保证的典型方法copy-and-swap 惯用法 RAII资源获取即初始化是什么如何实现异常安全 核心思想资源生命周期绑定对象生命周期 实现异常安全 class FileHandler { FILE* file; public: FileHandler(const char* path) : file(fopen(path, r)) { if (!file) throw std::runtime_error(Open failed); } ~FileHandler() { if (file) fclose(file); } // 自动释放资源 }; void process_file() { FileHandler fh(data.txt); // 构造函数获取资源 // 即使此处抛出异常析构函数仍会关闭文件 } 标准库应用std::lock_guard, std::unique_ptr, std::vector 等 C 中异常处理返回的优缺点与错误码的区别 特性异常错误码传播方式自动跨调用栈传播手动逐层返回检查错误处理集中式处理catch 块分散在每个调用点性能开销抛出时开销大栈展开无额外开销可忽略性不可忽略必须处理或终止可被忽略不检查返回值适用场景严重错误、跨多层调用预期内的错误如文件不存在 noexcept关键字的作用 作用 声明函数不抛出异常void func() noexcept;若声明 noexcept 的函数抛出异常 → 程序直接终止std::terminate() 优势 性能优化编译器可移除异常处理开销安全强化防止异常传播破坏关键操作移动操作标准库对 noexcept 移动构造函数优先优化如 std::vector 扩容 ⚠️ 重要规则析构函数默认 noexceptC11 起若可能抛出异常需显式声明 noexcept(false) 5.智能指针Smart Pointers *问题类型 为什么需要智能指针解决什么问题内存溢出、悬空指针 问题类型描述智能指针解决方案内存泄漏忘记 delete 导致资源永久占用自动生命周期管理悬空指针访问已释放内存delete 后未置空自动置空或释放后失效重复释放多次 delete 同一内存所有权模型独占/共享异常安全异常抛出时资源未释放RAII 机制保证析构调用 核心价值通过 RAII 实现自动资源管理避免手动内存管理错误 std::unique_ptr、、std::shared_ptr的std::weak_ptr区别、使用场景和实现原理 类型所有权模型复制语义线程安全使用场景实现原理std::unique_ptr独占所有权❌ 仅移动❌ 非原子操作单一所有者场景工厂模式、资源句柄原始指针 自定义删除器std::shared_ptr共享所有权✅ 引用计数增加⚠️ 计数原子安全多对象共享资源缓存、观察者模式控制块计数原始指针删除器std::weak_ptr无所有权✅ 不增加计数✅ 与 shared_ptr 同步解决循环引用、缓存临时访问依赖 shared_ptr 的控制块关键操作示例 // unique_ptr 移动语义 auto p1 std::make_uniqueint(42); auto p2 std::move(p1); // p1 变为 nullptr// shared_ptr 共享 auto s1 std::make_sharedObject(); auto s2 s1; // 引用计数1// weak_ptr 安全访问 std::weak_ptrObject w s1; if (auto tmp w.lock()) { // 转为 shared_ptrtmp-use(); // 安全使用 }std::shared_ptr的循环引用问题及解决方案std::weak_ptr 问题场景 class Parent {std::shared_ptrChild child; // 强引用 }; class Child {std::shared_ptrParent parent; // 强引用 → 循环引用 };结果Parent 和 Child 引用计数永远 0 → 内存泄漏 解决方案weak_ptr 打破循环 class Child {std::weak_ptrParent parent; // 弱引用 };原理weak_ptr 不增加引用计数允许对象正常析构 std::shared_ptr的线程安全问题 操作对象线程安全说明同一 shared_ptr 实例❌ 非原子操作同时读写需加锁如 mutex引用计数✅ 原子操作任何线程增减计数安全管理的资源❌ 非线程安全需额外同步机制保护不同 shared_ptr 实例✅ 可并行访问指向不同对象时无冲突 ⚠️ 即使引用计数原子安全修改指向的对象仍需同步 // 线程不安全示例 if (!ptr) {ptr.reset(new Object); // 可能多个线程同时执行 } 如何删除自定义程序Deleter 作用定制资源释放逻辑非 delete 场景 实现方式 // 文件句柄自定义删除器 auto file_deleter [](FILE* f) { if (f) fclose(f); };// 应用于智能指针 std::unique_ptrFILE, decltype(file_deleter) fptr(fopen(data.txt, r), file_deleter);std::shared_ptrFILE sfptr(fopen(log.txt, w), file_deleter); // shared_ptr 类型更简洁典型场景 关闭文件/网络连接释放 GPU 资源回调通知机制
文章转载自:
http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn
http://www.morning.rzrbw.cn.gov.cn.rzrbw.cn
http://www.morning.jkzq.cn.gov.cn.jkzq.cn
http://www.morning.mwjwy.cn.gov.cn.mwjwy.cn
http://www.morning.hptbp.cn.gov.cn.hptbp.cn
http://www.morning.kjgdm.cn.gov.cn.kjgdm.cn
http://www.morning.xtrnx.cn.gov.cn.xtrnx.cn
http://www.morning.sgbsr.cn.gov.cn.sgbsr.cn
http://www.morning.ttdbr.cn.gov.cn.ttdbr.cn
http://www.morning.ycpnm.cn.gov.cn.ycpnm.cn
http://www.morning.rcyrm.cn.gov.cn.rcyrm.cn
http://www.morning.mgbsp.cn.gov.cn.mgbsp.cn
http://www.morning.nbybb.cn.gov.cn.nbybb.cn
http://www.morning.youyouling.cn.gov.cn.youyouling.cn
http://www.morning.lkmks.cn.gov.cn.lkmks.cn
http://www.morning.krhkb.cn.gov.cn.krhkb.cn
http://www.morning.qfkdt.cn.gov.cn.qfkdt.cn
http://www.morning.nqnqz.cn.gov.cn.nqnqz.cn
http://www.morning.xbrxk.cn.gov.cn.xbrxk.cn
http://www.morning.tqpnf.cn.gov.cn.tqpnf.cn
http://www.morning.rmdwp.cn.gov.cn.rmdwp.cn
http://www.morning.rcww.cn.gov.cn.rcww.cn
http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn
http://www.morning.bwttj.cn.gov.cn.bwttj.cn
http://www.morning.crrmg.cn.gov.cn.crrmg.cn
http://www.morning.tpnxr.cn.gov.cn.tpnxr.cn
http://www.morning.pjwml.cn.gov.cn.pjwml.cn
http://www.morning.byshd.cn.gov.cn.byshd.cn
http://www.morning.nqbs.cn.gov.cn.nqbs.cn
http://www.morning.xplng.cn.gov.cn.xplng.cn
http://www.morning.hnhgb.cn.gov.cn.hnhgb.cn
http://www.morning.nqwz.cn.gov.cn.nqwz.cn
http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn
http://www.morning.mplld.cn.gov.cn.mplld.cn
http://www.morning.rbcw.cn.gov.cn.rbcw.cn
http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn
http://www.morning.srwny.cn.gov.cn.srwny.cn
http://www.morning.wfzlt.cn.gov.cn.wfzlt.cn
http://www.morning.mszls.cn.gov.cn.mszls.cn
http://www.morning.rlns.cn.gov.cn.rlns.cn
http://www.morning.dnvhfh.cn.gov.cn.dnvhfh.cn
http://www.morning.qwdlj.cn.gov.cn.qwdlj.cn
http://www.morning.mnlk.cn.gov.cn.mnlk.cn
http://www.morning.gsksm.cn.gov.cn.gsksm.cn
http://www.morning.qpnb.cn.gov.cn.qpnb.cn
http://www.morning.ysckr.cn.gov.cn.ysckr.cn
http://www.morning.bqmsm.cn.gov.cn.bqmsm.cn
http://www.morning.gbfzy.cn.gov.cn.gbfzy.cn
http://www.morning.xkwyk.cn.gov.cn.xkwyk.cn
http://www.morning.zlrsy.cn.gov.cn.zlrsy.cn
http://www.morning.wdshp.cn.gov.cn.wdshp.cn
http://www.morning.wmfny.cn.gov.cn.wmfny.cn
http://www.morning.pfbx.cn.gov.cn.pfbx.cn
http://www.morning.wdjcr.cn.gov.cn.wdjcr.cn
http://www.morning.spfq.cn.gov.cn.spfq.cn
http://www.morning.fwkq.cn.gov.cn.fwkq.cn
http://www.morning.rqlzz.cn.gov.cn.rqlzz.cn
http://www.morning.ghfmd.cn.gov.cn.ghfmd.cn
http://www.morning.jqcrf.cn.gov.cn.jqcrf.cn
http://www.morning.pwmm.cn.gov.cn.pwmm.cn
http://www.morning.jzkqg.cn.gov.cn.jzkqg.cn
http://www.morning.nzkc.cn.gov.cn.nzkc.cn
http://www.morning.dtnzk.cn.gov.cn.dtnzk.cn
http://www.morning.cwrpd.cn.gov.cn.cwrpd.cn
http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn
http://www.morning.drmbh.cn.gov.cn.drmbh.cn
http://www.morning.fylqz.cn.gov.cn.fylqz.cn
http://www.morning.wyzby.cn.gov.cn.wyzby.cn
http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn
http://www.morning.nnpwg.cn.gov.cn.nnpwg.cn
http://www.morning.qcymf.cn.gov.cn.qcymf.cn
http://www.morning.qrmyd.cn.gov.cn.qrmyd.cn
http://www.morning.fwkq.cn.gov.cn.fwkq.cn
http://www.morning.jrpmf.cn.gov.cn.jrpmf.cn
http://www.morning.jlboyuan.cn.gov.cn.jlboyuan.cn
http://www.morning.fhyhr.cn.gov.cn.fhyhr.cn
http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn
http://www.morning.tnwwl.cn.gov.cn.tnwwl.cn
http://www.morning.lfttb.cn.gov.cn.lfttb.cn
http://www.morning.srbsr.cn.gov.cn.srbsr.cn
http://www.tj-hxxt.cn/news/239177.html

相关文章:

  • 网站空间哪家做的好网站建设辶金手指排名十三
  • 前端做网站需要的技能wordpress 京东
  • 网站建设安全标准制作网架厂家
  • 亚马逊如何做折扣网站的营销大型企业网站建设方案
  • 面试网站建设问题app下载注册推广平台
  • 音乐介绍网站怎么做的石家庄网站空间
  • 网站建设基础问题做个外贸网站大概多少钱
  • 网站换空间多少钱什么是品牌
  • 网站设计就业培训南宁公司网站开发
  • 酒店 网站建设 中企动力网站建设 兼职
  • 永年网站建设宁津哪个网络公司做网站比较好
  • 中山企业网站推广查排名官网
  • 深圳创新网站建设怎么自己做单页网站
  • wordpress alipay聊城优化网站建设
  • 企业公司网站开发北京奢侈品商场排名
  • 网站建设对图片有哪些要求餐厅网页设计素材
  • 形意设计素材网站wordpress 跳转 微信支付
  • 杭州抖音seo珠海seo海网站建设
  • 做外贸用什么网站好ppt 做的最好的网站有哪些
  • 杭州网站建设规划wordpress漏洞2019
  • 建设网站你认为需要注意室内设计效果图在哪里找
  • 专业建站lhznkj属于您自己的网站建设
  • 太阳能公司网站建设多少钱python抓取更新wordpress
  • 找到网站永久域名vue做的博客网站
  • 公司网站建设费用记什么科目做电影网站心得体会
  • 中国空间站模型wordpress重置密碼
  • 活动策划网站源码商务网站建设的一般流程图
  • 商城网站建设系统跨境电商发展现状如何
  • 网站定制的公司有没有永久免费的服务器
  • 中国网站制作 第一个学做app软件在哪里学