为BUG编程:成员变量用指针char const *导致的BUG

最近程序出了一点BUG,原来运行得好好的程序,突然之间就signal 11了,出问题的调用被执行过很多次,但是在一处特定的执行点直接挂了。

诡异的是,加了一点调试输出,照样挂,但是多了两行系统函数的错误输出。

再加点输出,系统函数的错误输出变了,提示一个奇怪的参数不正确------完全不是我传进去的呀。

碰到这种情形不要慌,一般就是指针问题。

先看看代码怎么回事:

cpp 复制代码
	class CodeConverter 
	{
	private:
		iconv_t cd;
		char const * from_charset;
		char const * to_charset;
	public:
		bool initCodeConverter(const char* _from_charset, const char* _to_charset)
		{
    		from_charset = _from_charset;
			to_charset = _to_charset;

			return true;
		}
		bool convert(string & str)
		{
				string cmd = string("./iconv -f ") + from_charset + " -t " + to_charset + " iconv.tmp";
				......
				return true;
		}

	};

代码其实很简单,调用iconv命令转换编码(为什么不直接调用convert函数呢?因为设备上有些问题没解决,代码里面实际上是先尝试用convert函数的,然后才用iconv命令)。

这个类主要就是隐藏了两个字符集参数,以便重复调用的时候不用每次都传。处于某种习惯吧,随手就写了char const *,程序已经运行了很久,没有出过问题,所以看起来一切都欣欣向荣。

但是出了BUG之后就不爽了,经过插入大量跟踪语句,确认了出错位置在构造命令字符串那一句,结合莫名其妙的错误提示,马上想到是char const *问题,最初传入的指针指向的空间在后面已经失效了,被别的代码覆盖了,所以出错。于是改成string之后再运行,一切正常了。(这个BUG能准确复现,这是很幸运的)。

指针的BUG为什么很诡异呢?因为失效的指针指向的空间的内容是不确定的,可能是一个奇怪的数据,也可能是空,也可能还没有被覆盖。

  • 之前运行正常:因为还没有被覆盖
  • 在那一处异常:因为被覆盖了
  • 插入输出语句后现象不一样:因为程序内存布局改变了

所以这是一个教训:

成员变量的指针要谨慎使用。

(这里是结束)

相关推荐
D e re k ZH3 分钟前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin
青少儿编程课堂4 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
octopus_c1 小时前
C++ 运算符重载详解 && 日期类的实现
开发语言·c++
青少儿编程课堂1 小时前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
j7~1 小时前
【C++ 面试笔记】(篇二):类与数据抽象 & STL 容器与算法
开发语言·c++·面试·stl容器和算法·类和数据抽象
Fuyo_11191 小时前
深入解析 C++ unordered_set 与 unordered_map 的核心特性与性能实战
开发语言·c++
码匠许师傅1 小时前
【C++三方组件】FFmpeg:音视频处理的瑞士军刀
c++·ffmpeg·音视频
sg_knight2 小时前
Bug 定位实战:把报错丢给 Codex,它是怎么修的
chatgpt·llm·bug·openai·agent·ai编程·codex
ShineWinsu2 小时前
对于Qt:QPushButton常见属性的解析
开发语言·c++·qt·api·gui·按钮·qpushbutton
Lhan.zzZ2 小时前
用 Qt 构建线程安全的通讯静态库:从线程亲和性到完整工程
c++·vscode·qt·tcp/ip·udp