使用动态数组访问违规写入位置

时间:2017-07-27 21:10:20

标签: c++ access-violation dynamic-arrays

我有一个成员变量,指向一个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中的每个字符分配给动态数组中的每个索引。

1 个答案:

答案 0 :(得分: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。移动,只要您需要像原始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]=...尝试在此随机地址写入内存时。