我正在尝试使用 RawInput API 获取输入设备的名称,但是当我分配名称字符串时出现了一个奇怪的错误。基本上我在另一个项目中看到了这个,它工作得很好。这是有缺陷的代码:
std::string Input::GetDeviceName(void* device)
{
size_t size;
bool result = GetRawInputDeviceInfo(device, RIDI_DEVICENAME, null, &size) ;
if(result < 0)
{
throw RawInputException(GetLastError(), L"GetRawInputDeviceInfo(InputDeviceDataRequest::Name)");
}
std::vector<std::string::value_type> data(size);
result = GetRawInputDeviceInfo(device, RIDI_DEVICENAME, &data[0], &size);
if(result < 0)
{
throw RawInputException(GetLastError(), L"GetRawInputDeviceInfo(InputDeviceDataRequest::Name)");
}
std::string name = std::string(data.cbegin(), data.cend());
return(name);
}
相同的代码在我阅读的教程实现中运行良好,但是当我使用它时,它会在 *HeapAlloc(_crtheap, 0, size ? size : 1);* 处触发一个断点,从 std::string _name = std::string(data.cbegin(), data.cend()); 调用堆栈向下 10 层的某处。我检查了 vector 的值,它有大小为 61。我认为问题出在实际内容上?但是 std::string::value_type 会出什么问题?GetRawInputDeviceInfo() 返回 true,因此它成功地用字符填充了 vector 。正如我提到的,我从中读取的教程代码已构建并完美运行。对于那些感兴趣的人,这里是该项目的链接:The guy stopped updating it, but its almost fully functional
最佳答案
我认为这与以下事实有关,即根据您的编译器选项,字符串应该由 char
组成。或 wchar_t
.所以,而不是使用 std::string
, 你应该使用 std::basic_string<TCHAR>
.另外,您可能想看看 this question and its answers .
关于c++ - 使用 std::vector 迭代器分配 std::string 会在一个项目中导致调试错误,但在另一个项目中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062236/