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 安全吗?

如何将参数传递给afxbeginthread

使用 ::AfxBeginThread(ThreadFunc, &INDEX); 时如何传递参数

没有重载函数“AfxBeginThread”的实例与参数列表匹配

如何将运行时类传递给 AfxBeginThread

CWinThread 由 AfxBeginThread 创建后谁拥有它?