2017-07-27 114 views
-3

我有一個成員變量指向一個wchar_t數組,該數組將保存用戶通過控制檯給出的輸入。訪問衝突用動態數組寫入位置

wchar_t ** mArray; 

然後,在我的成員函數中,我要求來自用戶的輸入並將其存儲在std :: wstring中。之後,我使用這個wstring的長度爲mArray動態分配內存,併爲for循環分配每個字符。但是,我收到「訪問衝突寫入位置」錯誤。

std::wstring givenWstring; 
std::cin.ignore(); 
std::getline(std::wcin, givenWstring); 
mArray = new wchar_t*[givenWstring.length()]; 
for (size_t i = 0; i < givenWstring.length(); i++) { 
    *mArray[i] = givenWstring.at(i); 
} 

我不知道,因爲我是在動態數組中指定從wstring的每個字符各指標爲什麼我收到訪問衝突錯誤。

+0

也許'wchar_t * mArray;'是你需要的嗎?然後簡單地'mArray = new wchar_t [givenWstring.length()];''和'mArray [i] = givenWstring.at(i);'。 – DimChtz

+0

你的數組包含**未初始化的**'givenWstring.length()'**指針**到'wchar_t'。當你嘗試解除引用指針('* mArray [i]')時,你會得到未定義的行爲。 –

+0

@DimChtz,對不起。你是否建議我改用wchar_t *? – Skipher

回答

1

您必須將數據存儲在您的案例的適當對象的動態數組wchar_t中。即您需要一個指向wchar_t的指針來管理該陣列。

std::unique_ptr<wchar_t[]> mArray; // unique_ptr takes care of delete[] 
std::wstring givenWstring; 
std::cin.ignore(); 
std::getline(std::wcin, givenWstring); 
mArray.reset(new wchar_t[givenWstring.length()+1]); 
for(size_t i = 0; i < givenWstring.length(); i++) 
    mArray[i] = givenWstring.at(i); 
mArray[givenWstring.length()] = 0; 

然而,這種結構沒有可能的原因。到目前爲止,保留wchar_t陣列的最佳方法是std::wstring。 Moveover,只要你需要像一個原始const wchar_t*(C風格的字符串)表示,你可以使用std::string::c_str(),例如

void old_code(const wchar_t*);  // some old API 
old_code(mArray.c_str()); 

最後,我要解釋一下爲什麼你的訪問衝突。

wchar_t**mArray = new wchar_t*[givenWstring.length()]; 

分配的wchar_t*陣列未初始化(因此包含一些隨機數據)。然後*mArray返回這些隨機初始化的指針中的第一個,當*mArray[0]=...嘗試在此隨機地址寫入存儲器時。

+0

感謝您對使用unique_ptr解決此問題的見解。但是,是否有可能解決這個問題,而不使用unique_ptr?我想知道簡單的學習。是的,我也不喜歡在字符串上使用字符數組,但是我不得不這樣做,因爲某個SDK函數需要這樣做。 – Skipher

+0

那麼,爲什麼你認爲你需要這個數組來處理某個SDK函數?如果軟件開發工具包促成糟糕的編碼習慣(例如使用原始動態數組來支持容器),則不應該使用它。 – Walter

+0

@Blastfurnace確實。感謝您指出了這一點。現在修復。 – Walter