@wps.cn 邮箱 → 增加精准钓鱼、社工与撞库风险,带来企业形象与合规问题echo 打印 DATABASE_URL 等敏感变量 = 凭证泄漏。整改:移除 echo、轮换密码、改用 Protected/Masked Variablesgit init — 创建一个空的 Git 仓库git add → git commit → git pushgit reset --soft HEAD~1 — 撤销最近一次 commit,但保留工作区与暂存区中的改动git reset HEAD 或 git restore --staged — 把文件从暂存区撤出,不丢弃工作区修改git diff — 查看当前工作区与暂存区的差异.gitignore,依赖通过 npm install 还原git merge — 生成合并提交,保留分叉与汇合节点,适合需要审计的场景git rebase — 变基,使提交历史线性化、更整洁,但不能避免冲突git merge --abort — 合并冲突后取消合并git stash → 切 main 拉最新 → 建 hotfix/xxx 分支修复 → 推送 → 切回 feature → git stash popHEAD 在正常分支开发下,指向当前分支所指向的最新一次 commit 对象git log --stat — 查看每次提交的文件修改统计信息git log file.txt — 查看某个文件的修改历史git blame — 查看每一行代码是谁、在哪个 commit、什么时间修改的git diff — 查看冲突文件的细节feat — 新功能fix — 修复 bugperf — 性能优化 chore — 构建/工具变动git commit --amend — 修改最后一次提交的信息,不创建新 commitgit reset --soft HEAD~1 — 撤销 commit,保留工作区与暂存区改动git reset --hard HEAD~1 — 撤销 commit,丢弃工作区与暂存区对应改动git revert <commit> — 新增一次提交来抵消指定提交,适合已推送的共享分支历史git branch 列出本地分支,-a 可查看远程跟踪分支git switch -c feature / git checkout -b feature 创建并切换到新分支git push -u origin main 推送并建立跟踪关系git stash 暂存当前工作进度,git stash list 查看所有 stash,git stash apply 恢复后不会自动删除 stashint get() 与 int get() const 可共存;const 对象调用 const 版本,非 const 对象调用非 const 版本;const Test& 参数可接受临时对象#define SQUARE(x) x * x 中 SQUARE(a+1) 展开为 a+1*a+1;正确写法 ((x)*(x));a++ 传入宏会产生未定义行为short、char 提升为 int;float 提升为 double(而不是 long)int& 接受左值,const int& 接受右值和 const 左值;修改 int& 参数会影响原变量a = a++ + ++a; 同一次赋值中多次修改同一变量 = 未定义行为;有符号整数溢出 b += 1 也是未定义行为const int& 可绑定到常量左值、变量、右值(如 printVal(30));int& 不能绑定到 const 变量main 之前构造,在 main 返回之后析构(顺序与构造相反);块内对象先构造后析构,后构造先析构static 局部变量:首次执行到声明处初始化一次,之后沿用上一次的值;初始化在 main 的 srand() 之前则无法被回头改写static 局部变量在进程结束时析构,但与其他静态变量的析构顺序无法确定;MSVC 默认线程安全初始化(/Zc:threadSafeInit)double elapsedSec {};、int retryCount {}; 零值语义;bool finished = true; 指定初值;std::string statusLine; 默认构造为空串static const int kDigits[10]:存储期贯穿整个程序,只初始化一次;编译期常量在进入 main 前完成常量初始化main 前分段初始化,析构在 main 返回之后(可能借助 atexit 路径)int arr[] 本质是指针 int*,sizeof(arr) = 指针大小(32位下为4);main 中 sizeof(arr) 才是数组总字节数sizeof("hello") = 6(包含结尾 '\0');sizeof(str) 其中 str 是 const char* = 指针大小 4*p++ 先取 p 指向的值再自增;++*p 先对 p 指向的值自增再取;*++p 先自增指针再取值kScores[i](i ≥ 数组长度)是未定义行为:可能正常、可能崩溃,与优化级别、内存布局有关;编译器不会为 C 数组生成运行期越界检查char s_bufA[] = "world"、s_bufB[] = "world":数组名比较的是首元素地址;每个数组独立占空间(含 '\0')"xy" "zz" 相邻字面量拼接为 "xyzz";字面量存储通常是只读的,通过 const_cast 修改属于未定义行为;两个指针指向同一字面量并不保证地址相同NodeA 持 shared_ptr<NodeB>,NodeB 持 shared_ptr<NodeA> 形成环,强引用计数不归零 → 内存泄漏;破环用 weak_ptr(一侧弱引用即可)weak_ptr:lock() 可能返回空 shared_ptr(对象已析构时),使用前需检查;expired() 判断对象是否还活着shared_ptr(raw); shared_ptr(raw))→ 各自独立控制块,双重释放 = 严重未定义行为。惯用法:从裸指针接管时只交给一处make_shared:把 new 与构造绑定,对异常路径更友好;只分配一次内存(对象+控制块);make_unique<int>(7) 不是返回裸指针,不需要手动 deleteunique_ptr:只能移动不能拷贝(unique_ptr c = a; 编译失败);std::move(a) 后 a.get() == nullptr;b 析构时自动 delete 原对象use_count() 相同、get() 指向同一地址;控制块含强引用计数 + 弱引用计数(典型实现),shared_ptr 的 sizeof 通常为两个指针大小QScopedPointer<T> ≈ std::unique_ptr:作用域结束即释放的独占语义QSharedPointer<T> ≈ std::shared_ptr:共享所有权,配套 QWeakPointer(≈ std::weak_ptr)观察/破环QPointer<T> 仅适用于 QObject 派生类:对象被 Qt 对象树销毁后自动变空,不等价于任意 T 的 weak_ptr;QPointer 不延长对象寿命,也不拥有对象(析构不 delete)QWeakPointer 不能由裸指针直接构造挂接:QWeakPointer w(raw) 不会自动挂到已有强引用的计数上;必须由 QSharedPointer 构造*sp、sp->成员 的解引用开销小,但从创建、拷贝到析构全程有引用计数维护开销,并非与裸指针完全相当queueWidget(Widget w) 会拷贝/移动构造副本;按引用 wireWidget(Widget& w) 绑定已有对象不复制;复杂类型优先考虑 const 引用= delete 后,用左值按值传参编译失败new 分配在自由存储区(堆),指针变量本身在栈上;delete 包含析构 + 释放存储;忘记 delete = 内存泄漏delete[];未禁止拷贝会导致共享同一裸指针 → 双重释放风险new int[n] 必须用 delete[] m_p 释放F9 — 切换断点(增删/启用禁用)F10 — 单步跳过(Step Over),不进入函数内部F11 — 单步跳入(Step Into),进入被调用函数Shift+F5 — 停止调试(Stop Debugging)connect(sender, &Sender::signal, receiver, &Receiver::slot),编译期类型检查,更安全;旧式 SIGNAL()/SLOT() 宏靠字符串匹配,运行期才检查、易出错QLineEdit 单行输入框,文本被修改时发射 textChanged(const QString &) 信号QFormLayout:表单布局,标签与对应输入部件成对排列,像表单一样QHBoxLayout 水平排列、QVBoxLayout 垂直排列、QGridLayout 网格排列QApplication(notify)→ 目标对象的 QObject::event() → 具体事件处理函数(如 mousePressEvent、resizeEvent)QEvent;用 type() 函数获取当前事件的类型mousePressEvent(鼠标按下)、resizeEvent(部件大小改变)、wheelEvent(滚轮)等\0 标记结束、不保存长度信息(计算需遍历到 \0)、sizeof(str) 含终止符(如 "hello" 为 6);天然无法存储含 \0 的任意二进制数据char_traits<char>::compare() 内部转调 memcmp / __builtin_memcmp,体现零成本抽象:升级 C++ 标准获得编译器内建优化,不升级也不增加额外开销std::allocator 是空类,被 _Compressed_pair 压缩后不占空间 → 64 位下 sizeof(vector<int>) = 3 个指针 = 24;带 int 成员的有状态分配器 → 32std::codecvt 废弃原因:Unicode 转换远比标准库设计时想象的复杂、各实现质量差且不一致、Unicode 版本持续更新标准库无力维护 → C++17 标记废弃、C++26 删除u8"你好" 的类型是 const char8_t[N],不能隐式转换为 const char* 构造 std::string(C++17 时是 const char[N])wchar_t 跨平台不统一:Windows 2 字节、Linux 4 字节,用 L"..." 写跨平台代码有风险string_view 是借用视图,不拥有数据:返回局部 string 的 string_view 会形成悬垂引用,行为未定义(第5题);substr() 只调整指针+长度,O(1) 不复制string_view(避免构造临时 string);std::string 精确匹配 const string&;view 视图不保证以 \0 结尾,不能安全传给 C APIstd::string 可存放任意字节序列;Rust 的 String 严格要求 UTF-8 编码,且赋值是移动语义(C++ 的 b = a 是拷贝,语义不同);std::move 后源串内容未指定(标准不保证置空)std::format(C++20):编译期类型检查、{} 占位;QString::arg:%N 占位、支持国际化参数重排。format 的格式字符串不要求编译期可知(可以来自运行时),arg 格式化串也可运行时传入QStringLiteral:编译期将字面量编译为 UTF-16 数组,零运行时转换开销;QString("..."):运行期从 const char[] 转为 UTF-16(有转换开销)QString::arg() 嵌套陷阱:每次调用只替换编号最小且第一次出现的占位符(%1→%2→%3 依次)。例:.arg(name="%2").arg(95):第一步 %1→"%2" 得 "Hello %2, your score is %2";第二步 %2 只替换第一次出现 → "Hello 95, your score is %2"(新插入的 %2 不会被再次替换)isNull():字符串无数据(默认构造为 null,内容为空);isEmpty():长度为 0。所以 QString a; 的 isNull/isEmpty 均为 true,QString b = ""; 的 isNull 为 false、isEmpty 为 truem_pszData 指向 CStringData 中间的 data 起始位置,而非头部 —— 主要原因是兼容 C API:可直接当作 const TCHAR* 传给任何接受 C 字符串的函数loading="lazy" + 合理占位event.target.closest('[data-id]'),避免每行独立绑定事件URL.createObjectURL 产生的对象 URL 必须配对 URL.revokeObjectURL(url) 释放(图片不再使用或组件卸载时),否则内存持续上涨event.origin 白名单 + 消息结构/动作白名单;HTTPS、Base64、隐藏 iframe 都不能替代来源校验<script> 不够(还有 onerror、javascript: 等绕过)VITE_ 前缀变量会打入前端包,用户都能看到,真正密钥必须留在服务端;CI Secret 注入构建同样会进产物w2 start -n user -w '强密码'),处理后到安全平台自检确认风险消除Domain、Secure、SameSite、回跳域名和跨站跳转方式是否匹配(SSO 认证域回跳业务域不带 Cookie 的常见原因)AbortController 在组件卸载或 id 变化时取消旧请求,并单独处理 abort 错误不进入普通失败提示JSON.parse(localStorage...) 要 try/catch + 结构校验 + 默认值兜底,必要时清理损坏配置(旧版本写入的非 JSON 会白屏)toFixed(2) 只适合展示不适合计算then 里包 try/catch 抓不到 rejection,需 .catch()transform: scaleY(0.5) 按 DPR 缩放label + 合适的 autocomplete、inputmode 表达输入目的(自动填充、数字键盘)<details>/<summary>;标题按信息层级用 h1>h2>h3(视觉大小交给 CSS);对比表格用 <table>+scope;SPA 导航用真实 <a href> 由路由拦截aria-label 且图标本身 aria-hidden;商品图写描述性 alt、头像按上下文写名称或空 alt、纯装饰图空 alt;禁止嵌套交互控件(卡片用链接、收藏是独立按钮)display:none 隐藏 ≠ 安全;数据安全必须由后端对接口做权限校验(RBAC)<Navigate to="/login" /> 重定向;须与后端鉴权中间件配合,两端都校验npm run dev 生效;生产 .env.production 必须配正式 API 域名或由 Nginx 反代 /api,不能残留 localhostAccess-Control-Allow-Origin / Allow-Headers 等响应头Authorization: Bearer <token>,业务 API 免重复写鉴权头;401 由响应拦截器清 token 并跳登录return response.data 解一层后,后端 { code, message, data } 格式应取 res.data.list;联调时核对取值路径,避免多取/少取一层return cleanup(如 clearInterval),否则组件卸载后定时器仍运行 → 无效请求与内存泄漏setUser({ ...user, name }));直接 mutate 后 set 引用未变不会重渲染rowKey="id",否则行状态错乱git rm -r --cached 移出版本库;依赖由 package-lock.json 保证可复现安装立即禁用/轮换 Key 并排查调用记录;删除仓库、改 private 都无法撤销泄露Access-Control-Allow-Origin: * 与 Allow-Credentials: true 同开 = 任意来源可带 Cookie 凭据调用接口;应配置明确来源白名单chmod 777 权限过大有风险top / htop 查进程;磁盘满用 df -h 看分区;内存用 free -m;实时看容器日志用 docker logs -f <容器>服务名(DB_HOST 写 db 而非镜像名 mysql);容器内 localhost 指容器自己,不是别的容器USER 指定非 root;ENV DB_PASSWORD=xxx 会把密钥写进镜像层,应运行时注入/Secret 管理.dockerignore 排除 node_modules/.git/dist/logs 减小镜像docker ps 只看运行中、ps -a 看全部(含 Exited);容器删除后数据随之丢失,用 volume 挂载持久化;服务监听 0.0.0.0 且 -p 端口映射 外部才能访问SELECT * 把敏感字段带回前端索引失效,改写为范围查询