您能給出重現這個問題的例子嗎?聽起來感覺不太可能出現這種問題啊。
@ouyang
我開始也這么想, 后來找到原因后測試了好多次,發現每次地址都被改, 代碼不方便都貼出來,因為公司在用.我貼出部分來,大家看一看.
struct gameworld
{
bool bused; // 該服務器數據是否有效
CString worldname; // 服務器名
CString ChatServerUrl; // 游戲聊天服務器URL
CString StatusServerUrl; // 檢查服務器狀態的URL
int WorldOrder; // 服務器的序列
bool bstarted; // 該服務器是否啟動
CString LoginServerURL1; // 登錄服務器地址
CString LoginServerURL2;
CString QueueName1;
CString QueueName2;
CString QueueUrl1;
CString QueueUrl2;
CString LoginServerURL;
};
struct gameear
{
CString AuthServer;
CString PatchServer;
CString LauncherConfigurationServer;
gameworld pgameworld[20];
CString PatcherServerport;
CString gameearname;
int igameworldsize;
};
std::vector<pServerNode> m_pServerNodeList;
gameear agameear;
線程修改 agameear變量后, m_pServerNodeList的地址就錯了. 線程并沒有改m_pServerNodeList,
而把改成這樣就ok了:
gameear agameear;
std::vector<pServerNode> m_pServerNodeList;
凡是有直接或間接定義復制構造函數和operator=的類都不能那么用。
比較疑惑,CString的內部實現應該是有一個char*的成員變量,如果“寫入了大量的數據”的話會在堆上重新分配內存,應該不會影響他后面的變量的內存吧??怎么會出現“CString類的地址覆蓋了,它前面變量的地址”呢?