最近编程过程中遇到的一个BUG.

 首先我来描述一下,这个BUG是CString类的使用引起的,在编程过程中有个默认的规则,就是CStirng, std::string这种变长的数据类型是不可以做为模块参数进行传递和调用, 因为会引起崩溃, 这种情况我
也遇到过,但是这个错误并不是因为做为模块参数而引起的,而是因为包含Cstring 的结构体,在类定义时,

成员变量的顺序引起的,也就说将包含CSting类的结构体放在某个变量(这个变量是一个指针连表)前时,会出错,而放变量的后面就不出错,原因是因为包含CString类的结构体在一个线程中进行了修改,因为CString类是变长的,所以写入了大量的数据。使得CString类的地址覆盖了,它前面变量的地址,所以在程序退出时,删除错误的指针地址,造成崩溃。
Posted on 2010-06-08 13:35 郑兴锋 阅读(479) 评论(4)  编辑 收藏 引用

Feedback

# re: 一个 BUG  回复  更多评论   

2010-06-08 13:51 by ouyang
您能给出重现这个问题的例子吗?听起来感觉不太可能出现这种问题啊。

# re: 一个 BUG  回复  更多评论   

2010-06-08 14:41 by zhengxf
@ouyang
我开始也这么想, 后来找到原因后测试了好多次,发现每次地址都被改, 代码不方便都贴出来,因为公司在用.我贴出部分来,大家看一看.
struct gameworld
{
bool bused; // 该服务器数据是否有效
CString worldname; // 服务器名
CString ChatServerUrl; // 游戏聊天服务器URL
CString StatusServerUrl; // 检查服务器状态的URL
int WorldOrder; // 服务器的序列
bool bstarted; // 该服务器是否启动
CString LoginServerURL1; // 登录服务器地址
CString LoginServerURL2;
CString QueueName1;
CString QueueName2;
CString QueueUrl1;
CString QueueUrl2;
CString LoginServerURL;
};

struct gameear
{
CString AuthServer;
CString PatchServer;
CString LauncherConfigurationServer;
gameworld pgameworld[20];
CString PatcherServerport;
CString gameearname;
int igameworldsize;
};


std::vector<pServerNode> m_pServerNodeList;
gameear agameear;


线程修改 agameear变量后, m_pServerNodeList的地址就错了. 线程并没有改m_pServerNodeList,
而把改成这样就ok了:
gameear agameear;
std::vector<pServerNode> m_pServerNodeList;

# re: 一个 BUG  回复  更多评论   

2010-06-08 15:31 by 陈梓瀚(vczh)
凡是有直接或间接定义复制构造函数和operator=的类都不能那么用。

# re: 一个 BUG  回复  更多评论   

2010-06-23 15:46 by www
比较疑惑,CString的内部实现应该是有一个char*的成员变量,如果“写入了大量的数据”的话会在堆上重新分配内存,应该不会影响他后面的变量的内存吧??怎么会出现“CString类的地址覆盖了,它前面变量的地址”呢?

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理