c++ - 使用 std::vector 迭代器分配 std::string 会在一个项目中导致调试错误,但在另一个项目中有效?

标签 c++ string memory-management iterator

我正在尝试使用 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/

相关文章:

c++ - NSIS:ExecWait 如何处理否则会崩溃的 exe

c++ - tr ("\302\261") 在Qt中是什么意思?

c++ - 在 C++ 应用程序中使用非本地数据/媒体文件 (gtkmm)

javascript - 从变量获取 json 响应?

java - 如果 ArrayList<String> 包含数字以外的单词,则删除该值

c++ - 程序中变量的基址/静态地址是什么?

c++ - 如何删除树中的节点?

c# - 如何在 C# 中将常规字符串转换为 ASCII 十六进制字符串?

Java线程内存计算

memory-management - 如何延迟 Rust 的内存自动管理?