关于使用CString 出现的问题

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:\D\VC 2010\C\thefirstexcel\Debug\thefirstexcel.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
#include <afxdb.h>
#include <odbcinst.h>

extern CString strContents[256];
stdafx.cpp
#include "stdafx.h"
CString strContents[256];
然后进行编译,没有警告了。执行,然后能够很好的退出来,没有再出现问题和错误了。
我然后进行了其他一些测试,基本就是这个原因了。两个都有引用这个CString,但是第二个忽略了,但是引用计数器却没有加1.于是当CString使用完成后释放空间发现释放了一个释放过的空间,于是出错。

在此记录一下。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值