2017-07-27 113 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