概述
1、CString是一个很好用的结构体。我也是因为偶然的原因,用到了。当然遇见了很多的问题,还有一些精髓需要领悟。一些比较好的blog:
讲解CString的一些机制
http://blog.csdn.net/shupan001/article/details/6437783
CString一个好处是,比如我想连接两个字符串,char* 类型的话必须自己编程实现或者用函数strcat。但是CString就可以直接用“+”连接。实在是方便。更多方便了解了CString之后会发现。
2、首先把代码拿出来,然后说问题吧。
CSpreadSheet.h 和CSpreadSheet.cpp我就不说了,这个就是使用.xls的接口文件吧。网上可以下载到。我的另外一篇文章也有说过。
stdafx.h内容:
#include <afxdb.h>
#include <odbcinst.h>
CString strContents[256];
stdafx.cpp
#include "stdafx.h"
test.cpp
#include "stdafx.h"
#include "CSpreadSheet.h"
int getinformation()
{
CSpreadSheet SS("c:\test.xls", "");
CStringArray Rows, Column;
int k = 0;
for (int i = 1; i <= SS.GetTotalRows(); i++)
{
// 读取一行
SS.ReadRow(Rows, i);
for (int j = 1; j <= Rows.GetSize(); j++)
{
if(j == 1)
strContents[k++] = Rows.GetAt(j-1);
else
strContents[k++] = Rows.GetAt(j-1);
}
}
return 1;
}
int main()
{
getinformation();
return 0;
}
整个程序test在网上找一个程序自己修改了一下。然后编译通过。但是我输入了/force。warning是:
1>stdafx.obj : warning LNK4006: "class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > > * strContents" (?strContents@@3PAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A) 已在 CSpreadSheet.obj 中定义;已忽略第二个定义
1>test.obj : warning LNK4006: "class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > > * strContents" (?strContents@@3PAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A) 已在 CSpreadSheet.obj 中定义;已忽略第二个定义
1>F:DVC 2010CthefirstexcelDebugthefirstexcel.exe : warning LNK4088: 因 /FORCE 选项生成了映像;映像可能不能运行
1>test.obj : warning LNK4006: "class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > > * strContents" (?strContents@@3PAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A) 已在 CSpreadSheet.obj 中定义;已忽略第二个定义
1>F:DVC 2010CthefirstexcelDebugthefirstexcel.exe : warning LNK4088: 因 /FORCE 选项生成了映像;映像可能不能运行
执行的时候。断点在主函数getinformation()函数后面。getinformation函数运行良好。但是在return 0这一句出现了错误。
搜0xfeeefeee会出现很多。但是也基本上理解了这个错误的原因:就是试图释放一个已经释放的空间(或者叫2次释放空间)。堆栈断点在atlsimpstr.h
void Release() throw()
{
ATLASSERT( nRefs != 0 );
if( _AtlInterlockedDecrement( &nRefs ) <= 0 )
{
pStringMgr->Free( this );
}
}
在pStringMgr->Free(this)这一句断了下来。如果再往前的话,回不到程序,会进入汇编语言。
nRefs是引用次数吧。跟踪这个值发现nRefs在断点的时候是一个负值-17891603。联想到0xfeeefeee的错误,基本上认为是多次释放空间了。
那问题是哪里多次释放了空间。不禁想起了那个编译的时候的警告。
是不是这个原因呢。于是进行下面的修改。
stdafx.h
我然后进行了其他一些测试,基本就是这个原因了。两个都有引用这个CString,但是第二个忽略了,但是引用计数器却没有加1.于是当CString使用完成后释放空间发现释放了一个释放过的空间,于是出错。
stdafx.h
#include <afxdb.h>
#include <odbcinst.h>
extern CString strContents[256];
stdafx.cpp
#include "stdafx.h"
CString strContents[256];
然后进行编译,没有警告了。执行,然后能够很好的退出来,没有再出现问题和错误了。
我然后进行了其他一些测试,基本就是这个原因了。两个都有引用这个CString,但是第二个忽略了,但是引用计数器却没有加1.于是当CString使用完成后释放空间发现释放了一个释放过的空间,于是出错。
在此记录一下。
最后
以上就是彪壮泥猴桃为你收集整理的关于使用CString 出现的问题的全部内容,希望文章能够帮你解决关于使用CString 出现的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复