VC中CString变量赋值失败的奇怪有关问题
VC中CString变量赋值失败的奇怪问题
我的一个类中有三个CString的成员变量,奇怪的是在这个类中对CString变量的赋值会失败,本人测试发现好像在这个类中只前涉及到内存分配的操作都会引发一个异常,大家看看是什么原因造成的!
class CMyClass
{
private:
CString strDb,strUserName,strPassword;//在构造函数或其它初始化函数中没有对这三个CString变量进行操作
public:
...
int Initialize(LPCTSTR DataBaseName, LPCTSTR pszUserName, LPCTSTR pszPassword);
...
}
int CMyClass::Initialize(LPCTSTR DataBaseName, LPCTSTR pszUserName, LPCTSTR pszPassword)
{
...
//以下第一次对三个成员变量CString操作
strDb=DataBaseName;//可以分配成功
strUserName=pszUserName;//失败,
strPassword=pszPassword;
...
}
引发错误的最终跟踪代码是atlsimpstr.h文件的ATL_NOINLINE void Fork( __in int nLength )函数
ATL_NOINLINE void Fork( __in int nLength )
{
CStringData* pOldData = GetData();
int nOldLength = pOldData-> nDataLength;
CStringData* pNewData = pOldData-> pStringMgr-> Clone()-> Allocate( nLength, sizeof( XCHAR ) );
if( pNewData == NULL )//pNewData为NULL,似乎上句的内存分配失败了
{
ThrowMemoryException();//引发了内存异常
}
...
}
------解决方案--------------------
这种情况有点象dll hell。
dll hell的大概意思是dll里的内存布局变了(增加或减少了变量),但外部程序没重编译,导致内存混乱。
提个建议,rebuild all
------解决方案--------------------
rebuild看看
------解决方案--------------------
这样代码是没有问题的。
只能是别的地方引起的
class CMyClass
{
private:
CString strDb,strUserName,strPassword;//在构造函数或其它初始化函数中没有对这三个CString变量进行操作
public:
int Initialize(LPCTSTR DataBaseName, LPCTSTR pszUserName, LPCTSTR pszPassword);
};
int CMyClass::Initialize(LPCTSTR DataBaseName, LPCTSTR pszUserName, LPCTSTR pszPassword)
{
strDb=DataBaseName;//可以分配成功
strUserName=pszUserName;//失败,
strPassword=pszPassword;
return 0;
}
int main(int , char* [])
{
CMyClass x;
x.Initialize( _T( "aa ") , _T( "bb ") ,_T( "cc ") );
return 0;
};
------解决方案--------------------
怎么调用这个函数的?
------解决方案--------------------
前面的代码破坏了内存(最大的可能是越界)
要仔细检查前面的每句代码
------解决方案--------------------
我猜想了可能的一种情况
你在这个dll外面分配了内存进来,然后改动版本的时候,你对原来的分配内存的结构作了升级,比如增加了一个函数或者一个变量,你的应用程序使用了升级后的新结构,而你的dll却还使用以前的结构(可能是你忘记了同步), 然后就会出现很多奇怪的内存错,
以上都是假设,你可以检测客户端和服务端程序,确保没有发生这样的事
我的一个类中有三个CString的成员变量,奇怪的是在这个类中对CString变量的赋值会失败,本人测试发现好像在这个类中只前涉及到内存分配的操作都会引发一个异常,大家看看是什么原因造成的!
class CMyClass
{
private:
CString strDb,strUserName,strPassword;//在构造函数或其它初始化函数中没有对这三个CString变量进行操作
public:
...
int Initialize(LPCTSTR DataBaseName, LPCTSTR pszUserName, LPCTSTR pszPassword);
...
}
int CMyClass::Initialize(LPCTSTR DataBaseName, LPCTSTR pszUserName, LPCTSTR pszPassword)
{
...
//以下第一次对三个成员变量CString操作
strDb=DataBaseName;//可以分配成功
strUserName=pszUserName;//失败,
strPassword=pszPassword;
...
}
引发错误的最终跟踪代码是atlsimpstr.h文件的ATL_NOINLINE void Fork( __in int nLength )函数
ATL_NOINLINE void Fork( __in int nLength )
{
CStringData* pOldData = GetData();
int nOldLength = pOldData-> nDataLength;
CStringData* pNewData = pOldData-> pStringMgr-> Clone()-> Allocate( nLength, sizeof( XCHAR ) );
if( pNewData == NULL )//pNewData为NULL,似乎上句的内存分配失败了
{
ThrowMemoryException();//引发了内存异常
}
...
}
------解决方案--------------------
这种情况有点象dll hell。
dll hell的大概意思是dll里的内存布局变了(增加或减少了变量),但外部程序没重编译,导致内存混乱。
提个建议,rebuild all
------解决方案--------------------
rebuild看看
------解决方案--------------------
这样代码是没有问题的。
只能是别的地方引起的
class CMyClass
{
private:
CString strDb,strUserName,strPassword;//在构造函数或其它初始化函数中没有对这三个CString变量进行操作
public:
int Initialize(LPCTSTR DataBaseName, LPCTSTR pszUserName, LPCTSTR pszPassword);
};
int CMyClass::Initialize(LPCTSTR DataBaseName, LPCTSTR pszUserName, LPCTSTR pszPassword)
{
strDb=DataBaseName;//可以分配成功
strUserName=pszUserName;//失败,
strPassword=pszPassword;
return 0;
}
int main(int , char* [])
{
CMyClass x;
x.Initialize( _T( "aa ") , _T( "bb ") ,_T( "cc ") );
return 0;
};
------解决方案--------------------
怎么调用这个函数的?
------解决方案--------------------
前面的代码破坏了内存(最大的可能是越界)
要仔细检查前面的每句代码
------解决方案--------------------
我猜想了可能的一种情况
你在这个dll外面分配了内存进来,然后改动版本的时候,你对原来的分配内存的结构作了升级,比如增加了一个函数或者一个变量,你的应用程序使用了升级后的新结构,而你的dll却还使用以前的结构(可能是你忘记了同步), 然后就会出现很多奇怪的内存错,
以上都是假设,你可以检测客户端和服务端程序,确保没有发生这样的事