自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(207)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 跳板机访问云服务实例 与 SSH 转发

用华为云小带宽 VPS 做 SSH 跳板机是否够用?SSH 的转发能力有多强?

2026-11-06 23:11:14 182

原创 xvalue 的引入,对学习 C++ 难度的影响(二)

xvalue 是 C++ 移动语义的心智模型在类型系统中的体现,本质是“有身份且可移动”的表达式。它并非让 C++ 变难的主因,真正挑战来自模板、重载决议与生命周期管理。日常只需记住:具名变量是 lvalue,需 std::move 转为 xvalue 才能触发移动语义。关键陷阱包括 const 上 std::move 退化为拷贝、移动后对象状态不可用、以及引用绑定时生命周期延长规则——仅当引用直接绑定 prvalue 临时量或其子对象时才有效。xvalue 本身不延长生命周期,经函数返回或取成员后仍可能悬

2026-11-04 23:37:24 414

原创 xvalue 的引入,对学习 C++ 难度的影响(一)

C++11 引入 xvalue 与右值引用,使值类别增至三类(lvalue、xvalue、prvalue),支持移动语义与完美转发。虽概念复杂,但日常使用中标准库自动优化,无需频繁手动 std::move。真正难点在于编写类或泛型库时理解引用折叠、转发引用及移动语义细节。学习应循序渐进:先掌握直觉,再深入底层规则。

2026-11-04 22:37:02 146

原创 string s = “hello“; string t = std::move(s); t是什么类型?

std::move(s) 的类型是 std::string&&,但变量 t 的类型仍是 std::string。std::move 仅将 s 转为 xvalue,真正移动发生在 t 的移动构造函数调用中。t 作为具名变量始终是 lvalue,其类型由声明决定,不可变。移动后 s 处于有效但未指定状态,不应依赖其值。

2026-11-03 02:35:08 313

原创 C++ 不完整类型

不完整类型指编译器未知大小与布局的类型,如前置声明类、未知边界数组等。仅能进行不依赖大小的操作:声明指针/引用、函数参数、取地址、丢弃glvalue。prvalue需创建对象,故要求完整类型;而glvalue仅标识对象身份,可接受不完整类型。唯一例外是decltype操作数。测试验证了各标准下行为一致,核心区别在于“仅认身份”(glvalue)与“需产出值”(prvalue)。

2026-11-03 02:20:33 365

原创 C++ 引用 “int& a;”,编译器会报错,需要初始化

int& a; 声明非法,因引用必须在声明时初始化且不可改绑。正确用法如 int& a = x;,绑定到左值对象。非 const 左值引用不能绑定临时量,但 const int& 或 int&& 可以。引用赋值操作作用于被引用对象本身,而非改变绑定。函数参数、类成员(需初始化列表)、extern 声明等场合虽看似无初始值,实则绑定发生在其他位置。核心:引用是对象别名,必须初始化且终身不变。

2026-11-01 21:47:26 206

原创 C++ 报错的 qualifiers 的意思

报错中的“qualifiers”指类型限定符,即 const 和 volatile。本例中,const Person& 传入的 p 是常量对象,调用非 const 成员函数 setName 会试图将 const Person* 转为 Person*,丢弃 const 限定符,故报错。解决方法是:若函数不修改对象,应加 const 修饰符;否则不可在 const 对象上调用。

2026-10-31 15:27:14 186

原创 C++ const 引用不能调用非 const 成员函数

编译错误源于 const Person& p 只能调用 const 成员函数,而 setName 非 const,其 this 指针类型不匹配。两个条件缺一不可:参数为 const 且函数非 const。正确做法是避免在只读函数中调用修改成员的函数,保持接口语义一致。mutable 仅允许在 const 函数中修改特定成员。

2026-10-31 15:10:05 304

原创 C++ 移动语义(Move Semantics)详解

移动语义是C++11引入的核心特性,通过右值引用(&&)实现资源的转移而非复制,显著提升性能。它允许将临时对象或即将销毁的资源“偷走”,避免不必要的深拷贝。关键概念包括移动构造函数、移动赋值运算符和std::move(仅做类型转换)。为确保标准库使用移动而非拷贝,移动操作需标记noexcept。推荐遵循“零法则”,优先使用std::vector等自带资源管理的类型,让编译器自动生成高效移动操作。掌握移动语义是编写高性能现代C++代码的关键。

2026-10-27 00:21:45 290

原创 c语言和c++里面的左值、右值

C 语言仅有左值概念,指有地址的可寻址对象;而右值仅作为非左值的通俗说法,无正式定义。C++ 在此基础上构建了完整的左值/右值体系,引入纯右值(prvalue)、将亡值(xvalue)和右值引用(&&),核心目的为支持移动语义与资源高效转移,提升性能。因此,“右值体系”是 C++ 为优化对象生命周期管理而扩展的关键机制。

2026-10-26 22:43:20 201

原创 构造函数表达式的值类别是:prvalue

C++ 中构造表达式 T() 的结果为 prvalue,因其本质是“对象的初始化配方”而非已有对象。这一设计使编译器能强制执行复制消除(C++17起),直接在目标位置构造对象,实现零开销优化。即使类型不可拷贝或不可移动,也能合法初始化。同时,prvalue绑定引用时物化为xvalue,延长生命周期。该机制清晰区分初始化、移动与持久对象,是返回值优化和高效资源管理的语言基础。

2026-10-25 14:05:28 490

原创 C++ 中的 `T&&`:右值引用与转发引用

C++ 中 T&& 分为右值引用与转发引用:当 T 为确定类型时,T&& 是右值引用,用于移动语义;当 T 参与模板推导且形式为 T&& 时,为转发引用(万能引用),可完美转发左值或右值。关键在于 T 是否在模板参数中被推导。引用折叠规则决定最终类型:只要有一个 &,结果就是 &。std::move 无条件转右值,std::forward 保留原始值类别,实现完美转发。注意:有名字的右值引用表达式是左值。

2026-10-25 02:48:48 510

原创 C++ 中 xvalue 的 identity 存在哪里?和 lvalue 的 identity 有什么区别?

identity 是表达式指代确定对象的属性,不占单独内存,lvalue 与 xvalue 均为 glvalue,本质区别在于对对象资源的使用方式:lvalue 表示继续使用,xvalue 表示资源可重用(可能触发移动)。std::move(s) 不改变对象地址或身份,仅改变表达式值类别;移动的是资源状态而非对象本身,且移动后原对象仍有效但未指定。&std::move(s) 不合法,因取地址要求 lvalue。

2026-10-24 23:46:48 292

原创 C++ 中 构造函数 Test() 和 Test{} 是 xvalue 还是 prvalue?

Test() 和 Test{} 均为 prvalue(纯右值),非 xvalue。它们是创建对象的表达式,类型为 Test,值类别由 decltype((expr)) 验证:prvalue 对应 T,lvalue 对应 T&,xvalue 对应 T&&。C++17 中,临时对象实质化会将 prvalue 转为 xvalue 以绑定引用,但原表达式仍为 prvalue。构造函数本身非表达式,不参与值类别划分。

2026-10-24 23:31:42 183

原创 lvalue、xvalue、prvalue(二):引用是哪一类?

C++中引用类型(如T&、T&&)与表达式的值类别(lvalue、prvalue、xvalue)并非同一概念。右值引用变量本身是lvalue,如Test&& r = Test{}中r为lvalue;Test{}是prvalue,std::move(r)是xvalue。xvalue表示“即将消亡的值”,但不等于立即析构或已移动。正确判断需用decltype((expr)):得T&为lvalue,T&&为xvalue,非引用为prvalue。原文混淆了类型与值类别,错误认为“引用即xvalue”或“右值引用参数

2026-10-23 23:58:04 195

原创 lvalue、xvalue、prvalue(一):三者的分类

表达式分类的核心是三元划分:lvalue(左值)、xvalue(将亡值)、prvalue(纯右值)。glvalue(广义左值)= lvalue ∪ xvalue,rvalue = xvalue ∪ prvalue。xvalue 是两者的交集——既有 identity(可取地址),又可被移动。标准从“有无 identity”与“能否被移动”两个维度定义三类:有 identity 且可移动为 xvalue,有 identity 且不可移动为 lvalue,无 identity 为 prvalue。因此,真正互斥

2026-10-23 23:20:12 225

原创 引用的步长,是否有步长信息

本文澄清了C++中指针与引用的步长机制:指针仅存储地址,步长由静态类型在编译期决定,而非指针自身携带。p + 1与q + 1步长不同源于类型差异(int vs int[3]),而引用是对象别名,无“前进”操作,其运算作用于所引对象。标准不强制引用占用存储,且基类转换的偏移与元素步长属不同概念。原文核心观点正确,仅需补充“通常无额外步长字段”等限定,整体严谨。

2026-10-23 15:22:52 219

原创 单继承和多重继承的异同:基类成员的常量偏移

该代码中,rb、p、q 并不依赖“步长”访问成员。指针算术中的“步长”仅用于数组遍历,而此处仅为引用绑定与类型转换。成员访问基于静态类型确定的编译期常量偏移(如 a 在偏移0,b 在4,c 在8),运行时直接“基址+常数”访问,无乘法或步长参与。多重继承下地址调整为常量偏移,非步长。三者本质区别在于静态类型决定可见成员及偏移,而非访问方式。

2026-10-22 14:31:14 500

原创 c++类成员访问只看静态类型

pb 的静态类型为 Base*,成员访问仅依赖静态类型,故 pb->d 编译错误。pb->b 可访问,因 Base 声明了 b,且与 dv.b 共享同一内存。通过 static_cast<Derived*>(pb)->d 可访问 d,前提是 pb 确实指向 Derived 对象。虚函数可实现动态分派,但数据成员无此机制,无法“虚访问”。若对象非 Derived,强转后访问 d 会导致未定义行为(UB)。

2026-10-19 21:48:35 168

原创 无虚函数基类指针指向派生类对象,为什么能访问派生类成员变量?有虚函数的异同

基类指针只能访问基类声明的成员变量,即使其指向派生类对象。成员变量访问由指针的静态类型决定,与对象动态类型无关。虚函数仅影响函数调用的动态绑定,不改变成员变量访问权限。若需访问派生类新增成员,必须通过 static_cast 或安全的 dynamic_cast(要求基类有虚函数)进行显式转换,否则会导致未定义行为。

2026-10-19 21:46:10 426

原创 基类指针pb向下转型:static_cast<Derived*>(pb),能访问派生类成员

在单继承且基类位于偏移0的情况下,static_cast<Derived*>(pb) 转换后,若 pb 确实指向 Derived 对象(如 dv),则 pd->d 访问合法,行为定义明确。关键在于对象实际类型而非指针类型:指向纯 Base 时访问 d 为未定义行为。static_cast 仅做编译期地址调整,无运行时检查;安全转换应使用 dynamic_cast,但需多态类型支持。

2026-10-19 14:52:14 275

原创 标准的动态类型定义与“多态”无关,非多态对象同样会出现动态类型不同于静态类型的情形

C++ 中 glvalue 的动态类型定义不依赖多态性。根据标准,动态类型是其引用对象的最派生类型,与静态类型可能不同,即使对象非多态(如无虚函数的继承)。多态仅影响 typeid、dynamic_cast 和虚函数调用等行为,而非动态类型的定义本身。因此,“若 glvalue 指代多态对象,动态类型可能不同于静态类型”是误导性说法,正确表述应为:任何 glvalue 均有动态类型,即其所指对象的最派生类型,可能不同于表达式的静态类型。

2026-10-13 10:38:10 496

原创 glvalue 指代一个多态对象,它的动态类型可能不同于它的静态类型

glvalue 表达式具有静态类型,若其指代多态类型对象,则该对象的动态类型可能不同于表达式的静态类型。动态类型描述的是对象本身,而非表达式。仅当基类为多态类(含虚函数)时,才能进行运行时类型识别与虚函数分派。非多态基类引用虽可指向派生对象,但无法实现动态类型绑定。

2026-10-13 03:52:11 254

原创 C++ 虚函数表:基类和派生类共用一张 vtable 吗?

C++ 中,基类与派生类各自拥有独立的虚函数表(vtable),而非共用同一张表。虚表由编译器实现,非标准强制要求。多态类才有虚表和 vptr,对象构造时 vptr 会随阶段变化:基类构造期间指向基类虚表,此时调用虚函数不会触发派生类重写。未重写的虚函数槽位仍指向基类实现。虚调用通过对象的 vptr 查表,依据动态类型决定实际调用目标。多重继承下可能含多个 vptr,虚表布局因 ABI 而异,表格仅为简化模型。

2026-10-12 22:53:06 296

原创 C++ 类成员函数的内联定义(inline)详解

inline 是编译器优化建议,现代C++中更关键作用是允许多个编译单元中定义相同函数(满足ODR)。类体内定义的成员函数自动隐式inline;头文件中类外定义必须显式加inline,否则会因重复定义导致链接错误。大函数、需取地址或虚函数不宜内联。模板无需inline。最佳实践:小函数放类内,大函数放.cpp,头文件中类外定义必加inline。

2026-10-11 20:39:24 145

原创 c++的 Type Traits (二、更详细版本)

trait 是 C++ 模板元编程中用于提取类型特征的设计技巧,通过模板结构体承载类型别名或常量。type traits 则是标准库 <type_traits> 提供的编译期类型查询与变换工具,如 is_integral、remove_reference 等。二者关系密切:type traits 是 trait 思想在类型信息上的具体实现。前者更广泛(如 iterator_traits),后者专指标准库组件。实际应用包括重载选择、条件分支优化和参数约束,C++17 的 if constexpr 与 C++2

2026-10-11 10:18:12 422

原创 c++的 Type Traits (一)

Type Traits 是对类型特性的抽象描述,尤其在 C++ 中,通过 <type_traits> 提供编译期判断与转换类型属性的能力,如 is_integral、remove_const 等。它支撑模板元编程与 SFINAE,广泛用于泛型编程。其他语言如 Rust、Scala、PHP 也使用 Trait 表达行为复用或约束。词源来自 Smalltalk 的“可组合的行为单元”思想,核心是将特性独立抽取并组合。

2026-10-11 01:54:26 153

原创 C++11 的 ABI 的意思

C++ 的 ABI(应用程序二进制接口)是编译器与链接器间约定的底层规则,涵盖函数命名、内存布局、虚表、异常处理等。它决定了不同编译器或版本生成的代码能否正确链接与运行。自 C++11 起,标准库实现变化导致 ABI 可能不兼容,如 GCC 通过 _GLIBCXX_USE_CXX11_ABI 控制。使用时应关注版本与编译器一致性,建议在跨平台或共享库开发中采用稳定策略或第三方库以避免问题。

2026-10-10 22:04:11 244

原创 c++草案7.6.2.9 Delete [expr.delete]:基类指针删除派生类对象,基类需要有虚析构函数

若基类无虚析构函数,通过基类指针删除派生类对象将导致未定义行为(UB)。典型后果包括:派生类析构函数不被调用,资源泄漏;内存分配大小错误,引发堆损坏或崩溃;多继承/虚继承下偏移错误,直接导致程序崩溃。编译器优化可能使行为完全不可预测。正确做法是:基类析构函数要么 public virtual,要么 protected non-virtual 以禁止多态删除。示例中使用虚析构可确保安全析构顺序与内存释放。

2026-10-10 21:40:41 293

原创 c++的 ‘对象实际的最派生类型’,为什么叫 最派生类型

在C++中,最派生类型(most-derived type) 指继承链中离基类最远、最具体的类型。例如,FurtherDerived 是 Base → Derived → FurtherDerived 链中的最派生类型。即使通过基类指针指向该对象,其完整对象的实际类型仍为最派生类型。相关术语包括基类(base class)、派生类(derived class)、最派生对象(most-derived object),强调的是对象的完整实际类型,而非派生层级数量。

2026-10-09 08:40:55 137

原创 c++的静态类型和动态类型(一)

C++ 是静态类型语言,变量类型在编译期确定。所谓“动态类型”仅存在于多态场景:基类指针/引用的静态类型为基类,但运行时可指向派生类对象,其真实类型(动态类型)决定虚函数调用、dynamic_cast 和 typeid 的行为。静态类型用于类型检查与重载决议,动态类型仅在继承多态中体现。C++ 仍属静态类型系统,非如 Python/JS 的动态类型语言。

2026-10-09 08:30:32 127

原创 虚函数和 RTTI实现运行时多态

虚函数与RTTI是C++实现运行时多态的核心机制。虚函数通过虚函数表(vtable)和vptr实现动态绑定,确保基类指针调用正确的派生类函数;RTTI(typeid、dynamic_cast)则在运行时查询或验证对象的真实类型,支持安全转型与类型检查。二者均依赖多态类型(含虚函数),虚函数适用于日常多态调用,高效且推荐使用;RTTI应谨慎使用,频繁依赖常暗示设计缺陷。建议优先使用虚函数,必要时辅以RTTI,同时所有可能被基类指针删除的类都应声明虚析构函数。

2026-10-07 22:50:29 252

原创 c++的静态类型和动态类型(二)

本文详解C++中静态类型与动态类型的区别:静态类型在编译期确定,用于类型检查与函数重载;动态类型在运行期确定,仅对多态对象通过虚函数、typeid或dynamic_cast体现。文中示例说明虚函数按动态类型调用,非虚函数则按静态类型选择。需注意:Derived::bar()隐藏了基类同名函数,属“隐藏”而非“覆盖”;且动态类型严格指对象最派生类型,即使无虚函数也存在,只是无法通过RTTI观察。

2026-10-07 15:58:41 168

原创 curl 发送第三方公益中转站请求

安静地发送请求,显示完整的 HTTP 响应头和响应体,如果出错则显示错误信息。这是开发者、运维人员在写脚本或调试接口时非常常用的组合。默认情况下,curl 会把接收到的数据先存在缓冲区,等积累到一定量后再一次性输出。这对普通下载没问题,但对于实时数据流数据明明已经到了,但屏幕上迟迟不显示看起来像“卡住了”要等很久才一次性刷出一大堆内容加上-N后,curl 会关闭缓冲,数据一到就立刻显示在屏幕上。curl -N= 关闭输出缓冲,让数据实时输出,不等缓冲区满。

2026-10-06 22:36:21 146

原创 虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)

本文深入解析 C++ 链接错误中 vtable、名字修饰(如 _ZTV、_ZN)与重定位机制。通过真实报错案例,阐明:虚函数未定义导致 vtable for Base/Derived 未定义,因关键虚函数规则要求其定义必须存在;链接器在生成 PIE 时对只读节重定位发出警告,但根本原因是符号未定义;_ZTV 表示虚函数表符号,_ZN 为成员函数编码,二者均属 Itanium ABI 规范。最终揭示“无定义却报 vtable 缺失”的本质是编译器按规则生成虚表,但缺少对应函数定义所致。

2026-10-05 16:00:48 988

原创 虚函数vtable,在链接时,linker把符号地址写入构造函数(二)

C++ 链接错误 undefined reference to vtable 主因是虚函数仅有声明无定义,导致编译器无法生成完整的虚函数表(vtable)。符号 _ZTV4Base 表示 Base 类的 vtable,而 _ZN 系列则为命名修饰后的函数或类名。链接阶段因找不到虚函数实现,无法完成重定位,引发错误。警告 relocation against _ZTV in read-only section 是连带问题,根源仍为 vtable 未定义。修复方法:补全虚函数定义,并确保基类析构函数为 virt

2026-10-05 15:48:00 513

原创 快速切换chatgpt公益中转站的第三方key

通过自定义zzg命令将中转站Key导入Shell环境,并配置anya.config.toml文件,实现一键切换Codex使用指定API。执行zzg anya导出密钥后,运行codex --profile anya即可调用对应配置,便捷高效地接入自定义模型服务。

2026-10-04 23:04:46 331

原创 基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的

当通过基类指针删除派生类对象时,若基类无虚析构函数,行为未定义。尽管 Base 中的 virtual void f() 使多态生效,但析构函数不会自动变为虚函数。delete p; 仅调用基类析构函数,无法正确清理派生类资源。必须显式声明 virtual ~Base() = default;,确保通过基类指针删除时能正确调用派生类析构函数,避免未定义行为。

2026-10-04 22:26:47 179

原创 c++ 11 的abi的介绍

C++ ABI 是编译器与链接器约定的二进制接口规范,定义了函数名修饰、内存布局、虚表结构等底层规则。由于不同编译器或版本间 ABI 不兼容(如 C++11 后 libstdc++ 双 ABI 机制),可能导致链接失败或运行时崩溃。建议跨平台库使用 C 接口封装,固定编译器与标准库版本,并借助工具检查 ABI 兼容性,以确保稳定性。

2026-10-01 12:24:36 363

原创 polymorph.cpp里面的“析构函数、智能指针”问题

文件中两段代码均涉及多态,第一段存在内存泄漏且缺少虚析构函数,可能导致资源释放异常。第二段使用智能指针避免了泄漏,但建议显式添加虚析构函数以确保安全析构。修复方案推荐使用 std::unique_ptr 并为基类添加 virtual ~Base() = default;,实现安全、自动的内存管理,是面向对象编程中处理多态对象的规范做法。

2026-09-30 22:13:03 176

产生的core文件free(): double free detected in tcache 2

程序名称: ./headless_list +2 涉及的关键函数: list_insert(): 插入节点,包含 malloc 操作 。 +1 list_delete(): 删除节点,包含 free 操作 。 +1 list_find(): 查找节点 。 +1 崩溃发生点: 程序在打印出 "prepare into list_destory() ......" 之后崩溃 。 +1 直接诱因: 在执行 list_destroy() 函数期间,程序在释放链表节点时触发了 double free

2025-12-23

haproxy架构指南(中文翻译版).pdf

haproxy架构指南中文翻译版,版本V1.0时间2012-07-18版权GPL作者itnihao 邮箱 itnihao@qq.com本文档来自haproxy1.4.21官方文档的翻译,如有不妥之处,请邮件联系我,谢谢!注意:本文档1-3.1为此博客翻译http://blog.chinaunix.net/uid-10249062-id-348470.html 3.1章节以后为itnihao翻译本博客不定期维护更新此文档。

2018-02-26

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除