AfxBeginThread() + Cstring = 垃圾内容
Posted
技术标签:
【中文标题】AfxBeginThread() + Cstring = 垃圾内容【英文标题】:AfxBeginThread() + Cstring = garbage content 【发布时间】:2011-10-26 21:01:06 【问题描述】:请帮助我了解我的代码有什么问题。
头文件
typedef void (*pStatusCallback)(UINT code, const CString& message);
class CComunicator
private:
CUT_WSClient _client;
bool _shouldTerminate;
CString _serverAddress;
UINT _serverPort;
pStatusCallback _statusCallback;
UINT _ThreadFunc();
static UINT ThreadFunc(LPVOID pParam);
public:
CComunicator(const CString& serverAddress, UINT serverPort, pStatusCallback statusCallback);
~CComunicator(void);
void Start();
void Stop();
源文件
CComunicator::CComunicator(const CString& serverAddress, UINT serverPort, pStatusCallback statusCallback)
_serverAddress = serverAddress;
_serverPort = serverPort;
_statusCallback = statusCallback;
CComunicator::~CComunicator(void)
void CComunicator::Start()
_shouldTerminate = false;
AfxBeginThread(CComunicator::ThreadFunc, this);
void CComunicator::Stop()
_shouldTerminate = true;
UINT CComunicator::ThreadFunc(LPVOID pParam)
return ((CComunicator*)pParam)->_ThreadFunc();
UINT CComunicator::_ThreadFunc()
_statusCallback(0, _T("Connecting..."));
_client.Connect(_serverPort, _serverAddress);
_statusCallback(0, _T("Connected"));
// do here some work
_client.CloseConnection();
return 0;
用法
CComunicator com(_T("10.1.1.105"), 4502, ComunicatorCallback);
com.Start();
为什么在方法 _ThreadFunc 中的 _serverAddress 包含垃圾符号? _serverPort 有正确的值吗? 没有其他人在更改 _serverAddress。
感谢任何想法。
【问题讨论】:
天啊,大卫,你是对的,在那之后才刚刚结束 main 方法:) 所以程序完成了。谢谢! 【参考方案1】:错误出现在您未粘贴的代码中,就在com.Start();
之后。例如,如果该函数返回,com
超出范围,字符串也超出范围。而是这样做:
CComunicator *com=NEW CComunicator(_T("10.1.1.105"), 4502, CommunicatorCallback);
com->Start();
这将导致内存泄漏,因此您需要在完成后delete com;
。最好的方法可能是这样的:
UINT CComunicator::ThreadFunc(LPVOID pParam)
UNIT ret = ((CComunicator*)pParam)->_ThreadFunc();
delete (CComunicator *)pParam;
return ret;
其他可能性包括将对象保持在范围内,直到您确定线程已终止(如果创建对象的线程可以保持在同一范围内,直到对象的线程完成)和引用计数对象,其中对象的线程持有对该对象的引用。
【讨论】:
以上是关于AfxBeginThread() + Cstring = 垃圾内容的主要内容,如果未能解决你的问题,请参考以下文章
使用 ::AfxBeginThread(ThreadFunc, &INDEX); 时如何传递参数