MsgPack 中的 free()/delete 不匹配
我尝试在我的程序中使用 Msgpack。 有人可以帮助我处理 msgpack wiki 中的下一个示例(流媒体功能): http:// wiki.msgpack.org/pages/viewpage.action?pageId=1081387 并提供使用此库与流功能的更正确的示例。
#include <msgpack.hpp>
#include <iostream>
#include <string>
int main(void) {
// serializes multiple objects using msgpack::packer.
msgpack::sbuffer buffer;
msgpack::packer<msgpack::sbuffer> pk(&buffer);
pk.pack(std::string("Log message ... 1"));
pk.pack(std::string("Log message ... 2"));
pk.pack(std::string("Log message ... 3"));
// deserializes these objects using msgpack::unpacker.
msgpack::unpacker pac;
// feeds the buffer.
pac.reserve_buffer(buffer.size());
memcpy(pac.buffer(), buffer.data(), buffer.size());
pac.buffer_consumed(buffer.size());
// now starts streaming deserialization.
msgpack::unpacked result;
while(pac.next(&result)) {
std::cout << result.get() << std::endl;
}
// results:
// $ g++ stream.cc -lmsgpack -o stream
// $ ./stream
// "Log message ... 1"
// "Log message ... 2"
// "Log message ... 3"
}
Valgrind 说它有以下错误:
==11325== 1 errors in context 1 of 2:
==11325== Mismatched free() / delete / delete []
==11325== at 0x48CC919: operator delete(void*) (vg_replace_malloc.c:387)
==11325== by 0x804A623: std::auto_ptr<msgpack::zone>::reset(msgpack::zone*) (auto_ptr.h:242)
==11325== by 0x804A2E1: msgpack::unpacker::next(msgpack::unpacked*) (unpack.hpp:229)
==11325== by 0x8049E93: main (pack2.cpp:24)
==11325== Address 0x6e447c0 is 0 bytes inside a block of size 8,220 alloc'd
==11325== at 0x48CD876: malloc (vg_replace_malloc.c:236)
==11325== by 0x48DABC9: msgpack_zone_new (zone.c:198)
==11325== by 0x48D811F: msgpack_unpacker_release_zone (unpack.c:333)
==11325== by 0x804A3DA: msgpack::unpacker::release_zone() (unpack.hpp:261)
==11325== by 0x804A31C: msgpack::unpacker::next(msgpack::unpacked*) (unpack.hpp:234)
==11325== by 0x8049E93: main (pack2.cpp:24)
==11325==
==11325==
==11325== 2 errors in context 2 of 2:
==11325== Mismatched free() / delete / delete []
==11325== at 0x48CC919: operator delete(void*) (vg_replace_malloc.c:387)
==11325== by 0x804A623: std::auto_ptr<msgpack::zone>::reset(msgpack::zone*) (auto_ptr.h:242)
==11325== by 0x804A335: msgpack::unpacker::next(msgpack::unpacked*) (unpack.hpp:234)
==11325== by 0x8049E93: main (pack2.cpp:24)
==11325== Address 0x6e3c5c0 is 0 bytes inside a block of size 8,220 alloc'd
==11325== at 0x48CD876: malloc (vg_replace_malloc.c:236)
==11325== by 0x48DABC9: msgpack_zone_new (zone.c:198)
==11325== by 0x48D8211: msgpack_unpacker_init (unpack.c:194)
==11325== by 0x804A08D: msgpack::unpacker::unpacker(unsigned int) (unpack.hpp:187)
==11325== by 0x8049DC5: main (pack2.cpp:15)
I try to use Msgpack in my program.
Can someone help me with next example (Streaming feature) from msgpack wiki: http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387 and provide more correct example of using this library with streaming feature.
#include <msgpack.hpp>
#include <iostream>
#include <string>
int main(void) {
// serializes multiple objects using msgpack::packer.
msgpack::sbuffer buffer;
msgpack::packer<msgpack::sbuffer> pk(&buffer);
pk.pack(std::string("Log message ... 1"));
pk.pack(std::string("Log message ... 2"));
pk.pack(std::string("Log message ... 3"));
// deserializes these objects using msgpack::unpacker.
msgpack::unpacker pac;
// feeds the buffer.
pac.reserve_buffer(buffer.size());
memcpy(pac.buffer(), buffer.data(), buffer.size());
pac.buffer_consumed(buffer.size());
// now starts streaming deserialization.
msgpack::unpacked result;
while(pac.next(&result)) {
std::cout << result.get() << std::endl;
}
// results:
// $ g++ stream.cc -lmsgpack -o stream
// $ ./stream
// "Log message ... 1"
// "Log message ... 2"
// "Log message ... 3"
}
Valgrind say that it has next errors:
==11325== 1 errors in context 1 of 2:
==11325== Mismatched free() / delete / delete []
==11325== at 0x48CC919: operator delete(void*) (vg_replace_malloc.c:387)
==11325== by 0x804A623: std::auto_ptr<msgpack::zone>::reset(msgpack::zone*) (auto_ptr.h:242)
==11325== by 0x804A2E1: msgpack::unpacker::next(msgpack::unpacked*) (unpack.hpp:229)
==11325== by 0x8049E93: main (pack2.cpp:24)
==11325== Address 0x6e447c0 is 0 bytes inside a block of size 8,220 alloc'd
==11325== at 0x48CD876: malloc (vg_replace_malloc.c:236)
==11325== by 0x48DABC9: msgpack_zone_new (zone.c:198)
==11325== by 0x48D811F: msgpack_unpacker_release_zone (unpack.c:333)
==11325== by 0x804A3DA: msgpack::unpacker::release_zone() (unpack.hpp:261)
==11325== by 0x804A31C: msgpack::unpacker::next(msgpack::unpacked*) (unpack.hpp:234)
==11325== by 0x8049E93: main (pack2.cpp:24)
==11325==
==11325==
==11325== 2 errors in context 2 of 2:
==11325== Mismatched free() / delete / delete []
==11325== at 0x48CC919: operator delete(void*) (vg_replace_malloc.c:387)
==11325== by 0x804A623: std::auto_ptr<msgpack::zone>::reset(msgpack::zone*) (auto_ptr.h:242)
==11325== by 0x804A335: msgpack::unpacker::next(msgpack::unpacked*) (unpack.hpp:234)
==11325== by 0x8049E93: main (pack2.cpp:24)
==11325== Address 0x6e3c5c0 is 0 bytes inside a block of size 8,220 alloc'd
==11325== at 0x48CD876: malloc (vg_replace_malloc.c:236)
==11325== by 0x48DABC9: msgpack_zone_new (zone.c:198)
==11325== by 0x48D8211: msgpack_unpacker_init (unpack.c:194)
==11325== by 0x804A08D: msgpack::unpacker::unpacker(unsigned int) (unpack.hpp:187)
==11325== by 0x8049DC5: main (pack2.cpp:15)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
看起来这个例子中一切都很好。根据 valgrind 调用跟踪,该错误位于 Msgpack 库内部。
Looks like everything is ok in this example. According to valgrind call traces, the bug is somewere inside Msgpack library.
问题已在新版本中修复
https://github.com/msgpack/msgpack/pull/90
issue was fixed in new version
https://github.com/msgpack/msgpack/pull/90