直接写入 std::string 内部缓冲区

新手上路,请多包涵

我正在寻找一种方法将一些数据填充到跨 DLL 边界的字符串中。因为我们使用不同的编译器,所以我们所有的 dll 接口都是简单的 char*。

是否有正确的方法将指针传递给 dll 函数,以便它能够直接填充字符串缓冲区?

 string stringToFillIn(100, '\0');
FunctionInDLL( stringToFillIn.c_str(), stringToFillIn.size() );   // definitely WRONG!
FunctionInDLL( const_cast<char*>(stringToFillIn.data()), stringToFillIn.size() );    // WRONG?
FunctionInDLL( &stringToFillIn[0], stringToFillIn.size() );       // WRONG?
stringToFillIn.resize( strlen( stringToFillIn.c_str() ) );

看起来最有希望的是 &stringToFillIn[0] 但这是一种正确的方法,因为您认为 string::data() == &string[0]?似乎不一致。

还是最好吞下额外的分配并避免这个问题:

 vector<char> vectorToFillIn(100);
FunctionInDLL( &vectorToFillIn[0], vectorToFillIn.size() );
string dllGaveUs( &vectorToFillIn[0] );

原文由 markh44 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 707
2 个回答

我不确定标准是否保证 std::string 中的数据存储为 char* 。我能想到的最便携的方法是使用 std::vector ,它保证将其数据存储在连续的内存块中:

 std::vector<char> buffer(100);
FunctionInDLL(&buffer[0], buffer.size());
std::string stringToFillIn(&buffer[0]);

这当然需要将数据复制两次,这有点低效。

原文由 CAdaker 发布,翻译遵循 CC BY-SA 2.5 许可协议

您可以使用 char 分配在 unique_ptr --- 中的缓冲区来代替向量:

 // allocate buffer
auto buf = std::make_unique<char[]>(len);
// read data
FunctionInDLL(buf.get(), len);
// initialize string
std::string res { buf.get() };

您不能使用提到的方式直接写入字符串缓冲区,例如 &str[0]str.data()

 #include <iostream>
#include <string>
#include <sstream>

int main()
{
    std::string str;
    std::stringstream ss;
    ss << "test string";
    ss.read(&str[0], 4);       // doesn't work
    ss.read(str.data(), 4);    // doesn't work
    std::cout << str << '\n';
}

活生生的 例子

原文由 isnullxbh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题