使用动态数组访问冲突写入位置
Access violation writing location with dynamic array
我有一个指向 wchar_t 数组的成员变量,该数组将保存用户通过控制台给出的输入。
wchar_t ** mArray;
然后,在我的成员函数中,我要求用户输入并将其存储在 std::wstring 中。之后,我使用这个wstring的长度为mArray
动态分配内存,并在一个for循环中为每个字符赋值。但是,我收到 "access violation writing location" 错误。
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 中的每个字符分配给动态数组中的每个索引。
您必须将数据存储在适当对象的动态数组中,wchar_t
在您的例子中。 IE。您需要一个指向 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
returns 这些随机初始化的指针中的第一个,当 *mArray[0]=...
尝试在这个随机地址写入内存时。
我有一个指向 wchar_t 数组的成员变量,该数组将保存用户通过控制台给出的输入。
wchar_t ** mArray;
然后,在我的成员函数中,我要求用户输入并将其存储在 std::wstring 中。之后,我使用这个wstring的长度为mArray
动态分配内存,并在一个for循环中为每个字符赋值。但是,我收到 "access violation writing location" 错误。
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 中的每个字符分配给动态数组中的每个索引。
您必须将数据存储在适当对象的动态数组中,wchar_t
在您的例子中。 IE。您需要一个指向 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
returns 这些随机初始化的指针中的第一个,当 *mArray[0]=...
尝试在这个随机地址写入内存时。