我是靠谱客的博主 彪壮泥猴桃,最近开发中收集的这篇文章主要介绍关于使用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: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
#include <afxdb.h>
#include <odbcinst.h>

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

在此记录一下。


最后

以上就是彪壮泥猴桃为你收集整理的关于使用CString 出现的问题的全部内容,希望文章能够帮你解决关于使用CString 出现的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部