【发布时间】: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