【问题标题】:I'm passing an std::string to a boost function that takes a const reference to that type, but the value is mutated我将 std::string 传递给 boost 函数,该函数接受对该类型的 const 引用,但该值已发生突变
【发布时间】:2020-09-12 04:44:29
【问题描述】:

我将 std::string 传递给从 boost-program-options dll 导入的函数。该函数接受一个参数,它是对字符串的 const 引用。但是,函数接收的值与我传递的值不同。这是最小的代码

#include "boost/program_options.hpp"

int main()
{
    std::string s = "This is a string";
    auto res = boost::program_options::to_internal(s);
}

这是函数

BOOST_PROGRAM_OPTIONS_DECL std::string to_internal(const std::string& s)
{
    return s; 
}

当调用上面的函数时,参数“s”的值应该是“这是一个字符串”,但值总是不同的东西。当我说一些不同的东西时,我的意思是一个很长的随机字符串。只要basic_string构造函数抛出异常。

我唯一的猜测是它与函数的调用方式以及参数的传递方式有关,因为该函数是从外部 dll 导入的。

我遵循宏 BOOST_PROGRAM_OPTIONS_DECL 定义,它只是 __declspec(dllimport)

更多信息:

  • 标准是 C++14
  • 使用的工具集是 Visual Studio 2019 v142
  • Boost 库版本为 1.73.0,使用 vcpkg 安装

【问题讨论】:

  • 什么/是/价值? “不同的东西”不是一个好的描述。
  • 我猜您在其他代码中有 UB(您没有显示),或者您没有运行与您认为正在运行的源代码版本匹配的可执行文件。 coliru.stacked-crooked.com/a/9cbca54709035108
  • @sehe 值是一个随机的长字符串,所以我一开始就知道有问题,basic_string构造函数抛出异常,因为字符串太长。
  • @sehe 我在项目中有其他文件,但我正在评论 main 中的其他所有文件。所以我认为这不是我的代码中的 UB。不匹配的可执行文件的第二个选项更有可能是这种情况。
  • 如果在上面的代码中加上std::cout << res << '\n',会打印什么?垃圾?

标签: c++ boost dllimport stdstring boost-program-options


【解决方案1】:

致任何陷入相同情况的人(调用从 DLL 导入的函数并接收参数的垃圾值而不是实际传递的值) 这可能是因为用于构建项目和 DLL 的配置不匹配。 就我而言,我使用 Vcpkg 安装了一些 boost 库。在调试配置中构建我的项目时,我正在使用发布版本。原来 Vcpkg 制作了一组不同的构建以用于调试配置。我改用这些,现在它可以工作了。

【讨论】:

  • 我最好的猜测是“用于编译库和客户端的不同编译器选项”,所以我很高兴你知道了这一点。这种事情可能会让人很困惑。
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多