【问题标题】:How to de-serialize correctly a string pointer?如何正确反序列化字符串指针?
【发布时间】:2016-12-06 09:12:48
【问题描述】:

在 C++ 开发中相对较新,特别是序列化。

我有一个使用 ZeroMQ 接收序列化消息的网络应用程序,检查其中一个字段,如果具有特定值,它会再次使用 ZeroMQ 将消息转发到另一个客户端。

所以函数 A 接收到消息并将其存储到字符串指针中:

void A()
{
  std::string* serialStr = new string(static_cast<char*>(input->Data()), input->Size());

  if(B(serialStr) == "One") {
    CreateMessage(const_cast<char*>(serialStr->c_str()), serialStr->length(), cleanup, serialStr));
  }
}

cleanup(void *data, void *hint) {delete (string*)hint;}

CreateMessage 函数负责实际删除serialStr。

如何在不复制 serialStr 字符串的情况下调用函数 B?以下内容不起作用:

std::string B(std::string* data)
{
  messaging::BMessage* msg = new messaging::BMessage;
  msg->ParseFromString(data);

  return msg->data();
}

感谢您的帮助!

【问题讨论】:

  • 你为什么在第一名使用std::string*指针?
  • 您的函数中存在内存泄漏。不用担心复制,其中大部分将是移动(使用相对现代的 C++ 编译器)或将被省略。
  • 貌似你内部使用的是“Google protobuf”,但实际问题不清楚,问题出在哪里。还要记住,std::string 不会一直复制字面意思。参考Copy On Write
  • 你不能将指针从一个进程序列化到另一个进程,它指向的内存只存在于一个进程中。另一个进程中的相同地址将包含完全不同的东西。
  • @iammilind copy-on-write 即将推出(主流标准库的最新版本都没有这样做,最新版本之前的版本也没有)。

标签: c++ string pointers serialization protocol-buffers


【解决方案1】:

引用有什么问题?以及它是如何在不复制的情况下实现的(当它是引用或指针时只复制地址)

    std::string B(std::string& data) 
{
  messaging::BMessage* msg = new messaging::BMessage;
  msg->ParseFromString(data); // here didn't work probably coz this function takes string (with string*  data is address)

  return msg->data();
}

【讨论】:

  • 请修复泄漏。并且 ParseFromString 不带参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多