2011-07-22 71 views
4

我嘗試在我的程序中使用Msgpack。 有人可以幫助我下一個例子(流媒體功能)從msgpack維基:http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387和提供更正確的例子,使用此庫與流功能。MsgPack中的不匹配空閒()/刪除

#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) 
+0

必須在庫的內部的東西。根據valgrind,它使用'auto_ptr',它是硬編碼來調用'delete'。你可以更新你的庫到C++ 0x並使用'shared_ptr',它存儲定製的刪除器,並且也可以處理'malloc()'ed內存。 –

回答

2

看起來一切都在這個例子中確定。根據valgrind調用跟蹤,這個錯誤有些在Msgpack庫中。