CString错误: 老是出现莫名其妙的错误。

时间:2021-06-30 19:43:52
我在对话框类中创建了一个线程,用来执行主要的功能

再线程中,用到类中的一个CString类型的 公共变量,这个变量与EDIT控件关联

在线程中,一运行到读取这个变量的值的时候就出错

代码例子:
//线程函数内
CxxDlg *obj = (CxxDlg *)lParam; //lParam为创建线程时传递的参数

CString str = obj->m_path;        //出错位置

调试了一下,发现是CString出得错,把出错的内部代码贴出来:
const CString& CString::operator=(const CString& stringSrc)
{
if (m_pchData != stringSrc.m_pchData)
{
if ((GetData()->nRefs < 0 && GetData() != _afxDataNil) ||
stringSrc.GetData()->nRefs < 0)
{
// actual copy necessary since one of the strings is locked
AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
}
else
{
// can just copy references around
Release();
ASSERT(stringSrc.GetData() != _afxDataNil);
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
}
return *this;
}

请求各位大虾帮忙!

13 个解决方案

#1


obj->m_path 出什么错?把错误贴出来看下!
m_path 是什么类型的?莫非是const?

#2


楼主把错误信息也贴出来吧,看看是什么原因。

#3


要看的是线程调用的地方,不是线程内部。

#4


obj->m_path的问题,不是CString 的问题

#5


1)不应该在线程内执行的代码你执行了,MFC的有些东西,每个线程都要初期化
2)你给的信息还是不足,可能是你代码的其他部分有问题
3)如果想绕开,可以在线程内发消息,让主线程来执行(前提是没有2的问题)

#6


肯定不是CString 的错误,
应该是obj->m_path的错误

#7


检查一下lParam参数是否传对了.

#8


CString str = obj->m_path; //出错位置

还是写一个Get函数吧,别直接这个把一个成员变量扔出来

#9


CString不是线程安全的
跨模块、跨线程时,用char *或BSTR

#10


lParam这个参数是什么?
this指针?

#11


引用 1 楼 cabinriver 的回复:
obj->m_path 出什么错?把错误贴出来看下!
m_path 是什么类型的?莫非是const?


不好意思,忘记说明了,m_path就是CString类型的

#12


你再检查下你的obj->m_path 如果真的是Cstring类型的是不会报错的。
确认

#13


还有就是跟踪下你的obj指针,如果指针错了不是对话框指针,那么肯定也会出错。

#1


obj->m_path 出什么错?把错误贴出来看下!
m_path 是什么类型的?莫非是const?

#2


楼主把错误信息也贴出来吧,看看是什么原因。

#3


要看的是线程调用的地方,不是线程内部。

#4


obj->m_path的问题,不是CString 的问题

#5


1)不应该在线程内执行的代码你执行了,MFC的有些东西,每个线程都要初期化
2)你给的信息还是不足,可能是你代码的其他部分有问题
3)如果想绕开,可以在线程内发消息,让主线程来执行(前提是没有2的问题)

#6


肯定不是CString 的错误,
应该是obj->m_path的错误

#7


检查一下lParam参数是否传对了.

#8


CString str = obj->m_path; //出错位置

还是写一个Get函数吧,别直接这个把一个成员变量扔出来

#9


CString不是线程安全的
跨模块、跨线程时,用char *或BSTR

#10


lParam这个参数是什么?
this指针?

#11


引用 1 楼 cabinriver 的回复:
obj->m_path 出什么错?把错误贴出来看下!
m_path 是什么类型的?莫非是const?


不好意思,忘记说明了,m_path就是CString类型的

#12


你再检查下你的obj->m_path 如果真的是Cstring类型的是不会报错的。
确认

#13


还有就是跟踪下你的obj指针,如果指针错了不是对话框指针,那么肯定也会出错。