新建了一个C++类,然后开启了一个线程,发现在线程中通过类的指针访问某些类的成员变量时会出现错误,int之类的没问题,但访问CArray等会出新错误,而在普通的成员函数中访问却没问题,而且编译时连警告也没有。
    访问CArray提示的信息如下:0x0005123a 处未处理的异常: 0xC0000005: 读取位置 0x0005123a 时发生访问冲突。
    开始怀疑开启线程的方式不合理,AfxBeginThread和CreateThread都试了,都提示相同的错误。
    这是什么原因?哪位给讲一下,先谢过!!!!

解决方案 »

  1.   


    //头文件
    #pragma once
    #include <afxtempl.h>
    #include   <afxmt.h>struct ClientInf
    {
    SOCKADDR_IN Addr;        //客户端地址
    CTime LastBeat;                                     //上次心跳时间
    };class CTest
    {
    public:
    CTest(void);
    ~CTest(void);
    public:
    int ServerPort;
    CWinThread * m_thRecv;                        //接收线程
    CArray<ClientInf,ClientInf> m_ClientIfo;//登陆的客户端信息
    public:
    BOOL Start();                                          //开启
    static UINT _DataRecv(LPVOID lparam);//接收线程
    };
    //源文件
    #include "StdAfx.h"
    #include "Test.h"
    DWORD WINAPI _DataRecEx(LPVOID lparam);
    CTest::CTest(void)
    {
    }CTest::~CTest(void)
    {
    }BOOL CTest::Start()
    {
    ClientInf NewClient;
    ServerPort=3;
    m_ClientIfo.Add(NewClient);              //没问题
    //m_thRecv=AfxBeginThread(_DataRecv,(LPVOID)this);
    CreateThread(NULL,0,_DataRecEx,(LPVOID)this,0,NULL);
    return TRUE;
    }
    //接收线程
    UINT CTest::_DataRecv(LPVOID lparam)
    {
    CTest *pthis=(CTest*)lparam;
    ClientInf NewClient;

    pthis->m_ClientIfo.Add(NewClient);            //报错

    return 0;
    }
    DWORD WINAPI _DataRecEx(LPVOID lparam)
    {
    CTest *pthis=(CTest*)lparam;
    pthis->ServerPort=3;
    ClientInf NewClient;
    pthis->m_ClientIfo.Add(NewClient);           //报错

    return 0;
    }
      

  2.   

    你自己重新new一个变量 = 类成员,不要调用类成员试试
      

  3.   

    之前试过socket,重新定义一个让其等于类成员,也是不行,实在没招了定义为一个全局的。
      

  4.   


    使用的部分:
    CTest test;
    test.Start();感觉也不应该有问题,但就是提示错误
      

  5.   

    Start 返回后,
    test 就销毁了。
    所以 pThis 就没有意义了。