目录
[为什么 man Json::Reader::parse 找不到?](#为什么 man Json::Reader::parse 找不到?)
为什么不会崩溃?为什么在41的Listen()才报错?为什么在写入野指针的时候不会报错?VS2022?
[📊 Linux vs Windows 地址对比](#📊 Linux vs Windows 地址对比)
[recv()及一系列的void* buf参数](#recv()及一系列的void* buf参数)
pthread_create()调用内部类函数虽参数、返回值符合格式但因:"域名访问限制,导致参数类型不符"。

解决办法:加static,去除域限定作用。
增:类内访问"域作用限定",必不可少!!
自定义错误码枚举体


man手册的查询范围
css
w@instance-qhw6x01g:~CustomizeProtocol/$ man Json::Reader::parse
No manual entry for Json::Reader::parse
1.Linux系统调用。
2.C库函数。
3.系统管理命令。(像rm cd touch)
为什么 man Json::Reader::parse 找不到?
| 命令 | 查找范围 | 是否支持 C++ 类 |
|---|---|---|
man |
系统手册(Section 1-8) | ❌ 不支持(只有 C 函数) |
man 3 printf |
C 标准库 | ❌ 不支持 C++ 类 |
man std::string |
C++ 标准库 | ❌ 大部分发行版不支持 |
非静态成员引用必须与特定对象相对
std::string::substr (0, pos)

原因:必须使用相应的实例对象来调用接口。不能匿名调用
两个头文件相互包含?
当代码量激增、文件数激增。一定要注意头文件相互包含的情况。
Protocol.hpp
cpp
#pragma once
#include"../Package/Log.hpp"
#include<jsoncpp/json/json.h>
#include"Socket.hpp"
#include"../Package/Comn.hpp"
#include"Calculate.hpp"
#include<functional>
Calculate.hpp
cpp
#pragma once
#include<string>
#include"Protocol.hpp"

服务端Listen()段错误
esc切到上窗口:"Space"打断点

i切到gdb窗口

两个参数 "r 8081"

s进入函数执行,n不进入
报错:
css
(gdb) n
[2026-08-20 10:33:23] [INFO] [41339] [Socket.hpp] [40] - Bind完成
Program received signal SIGSEGV, Segmentation fault.
0x000055555555973e in SocketClass::TCPServerBuild (this=0x555555575ef0) at /home/w/e2026/Auguest/CustomizeProtocol/SocketCom/Socket.
hpp:41
41 Listen ();
🐉龙级dubug野指针错误
查了一晚上+1h
症状:问题出现在Listen()的调用上,调用不过去。就出现段错误的提示
1.检测继承、定义、声明问题。
2.检测拼写问题。
3.进入Socket()、Bind()主要查看_sockfd的定义问题。
4.求助AI
反思:debug路径错误,指针使用习惯不好(未及时初始化)。
InetAddr中未对成员char* _port; 及时初始化,导致野指针访问。
为什么报错位置偏移?(知识补充)野指针访问不应该直接报错吗?



这是标准的野指针格式 "x*VUUU" 。(为什么这么大?(即使是正常指针)这是因为Linux系统的原因)


strcpy执行后

"这是野指针赋值"
为什么不会崩溃?为什么在41的Listen()才报错?为什么在写入野指针的时候不会报错?VS2022?
这是因为Linux下区别于Win(的Dubug)它继续运行,是栈的继续使用(如上次的指针废弃后的复用)无法识别野指针!
回顾需函数调用机制
执行Listen()前:

在执行① 时就已经报错了!!
gdb查函数栈帧
bash
info address TCPSocket::Listen()

Linux与WIn地址对比
📊 Linux vs Windows 地址对比
| 特性 | Linux (64位) | Windows (64位) |
|---|---|---|
| 地址范围 | 0x555555555xxx 或 0x7fffxxxx |
0x00007ff7xxxx 或 0x000001xxxx |
| 典型堆地址 | 0x555555xxxxxx |
0x000001xxxx |
| 典型栈地址 | 0x7fffxxxxxxxx |
0x000000xxxxx |
| 典型大小 | 48 位有效地址 | 44-48 位有效地址 |
recv()及一系列的void* buf参数
void* buf参数指的是可以被按照字节流式填充的字段,因此就直接限定了纯粹数组。*string不行,因为其内部封装以指针、容量等。
头文件循环包含问题
解决此问题的基础知识:
1.类内成员函数编译时机------C++规定:类内成员函数体的编译时机是在该类的"};"之后进行的。(方便了类内函数体实现时机的灵活性)
2.头文件展开的性质:头文件是依次展开,我们可以假设哪个头文件先展开而后逐渐推理出完整链条。(而非并发什么的)
解决方法
1.方法解耦:即所用到的那个模块可不可以用无耦合文件内部实现。
2.前置声明(局限性):先让编译器认识"这是一个类的名字"。禁止做内部解析。


错误码尽量打印
cpp
fprintf(stderr, "fail: %s (errno=%d, ret=%d)\n", \
strerror(errno), errno, ret);