【发布时间】:2013-02-25 07:44:51
【问题描述】:
我正在尝试使用 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 级。我检查了向量的值,它有大小为 61。我认为问题出在实际内容上?但是 std::string::value_type 会出现什么问题?GetRawInputDeviceInfo() 返回 true,因此它成功地用字符填充了向量。正如我提到的,我从中读取的教程代码构建并完美运行。对于那些感兴趣的人,这是该项目的链接:The guy stopped updating it, but its almost fully functional
【问题讨论】:
标签: c++ string memory-management iterator