我嘗試使用兩個庫(pugixml / libzip)創建一個壓縮檔案并在其中插入一個xml檔案,一切正常,但是當我打開xml檔案時,檔案開頭的編碼很奇怪:
主要.cpp:
#include <iostream>
#include <sstream>
#include <zip.h>
#include <pugixml.hpp>
#include <memory>
using namespace std;
int main()
{
auto document = std::unique_ptr<pugi::xml_document>(new pugi::xml_document);
pugi::xml_node declNode = document->prepend_child(pugi::node_declaration);
declNode.append_attribute("version") = "1.0";
declNode.append_attribute("encoding") = "UTF-8";
declNode.append_attribute("standalone") = "yes";
pugi::xml_node rootNode = document->append_child("Document");
rootNode.append_child("Files");
int err = 0;
zip_t* zip = zip_open("test.zip", ZIP_CREATE, &err);
{
{
std::stringstream ss;
document->save(ss, " ");
std::string buffer = ss.str();
auto src = zip_source_buffer_create(buffer.c_str(),buffer.length(),0,0);
zip_file_add(zip,"Document.xml",src,ZIP_FL_ENC_UTF_8);
}
}
zip_close(zip);
return 0;
}
檔案.xml:
~U ? U rsion="1.0" encoding="UTF-8" standalone="yes"?>
<Document>
<Files />
</Document>
十六進制:
uj5u.com熱心網友回復:
由于讀取已釋放的記憶體,發布的程式具有未定義的行為。
在您發布的示例中,使用zip_source_t
creatd 創建freep = 0
,因此您需要確保提供的緩沖區在zip_source_t
物件的整個生命周期內保持有效:
zip_source_buffer
zip_source_t * zip_source_buffer_create(const void *data, zip_uint64_t len, int freep, zip_error_t *error);
函式
zip_source_buffer()
并從大小為lenzip_source_buffer_create()
的緩沖區資料創建一個 zip 源。如果freep不為零,則緩沖區將在不再需要時被釋放。資料必須在創建的源的生命周期內保持有效。 該源可用于打開一個 zip 存檔。
zip_file_add()
(如果成功)將獲得您提供給它的源的所有權,但請注意,不需要立即釋放源 - 例如,它可以將其存盤在zip_t
.
由于它當前實作zip_file_add()
并沒有釋放zip_source_t
- 它而是掛在它上并在您呼叫時將其寫出zip_close()
。因此,您的緩沖區需要在物件的整個剩余生命周期內保持有效zip_t
- 在這種情況下,直到呼叫zip_close()
.
如果您重寫示例以保持std::string buffer;
活動狀態,直到您關閉,zip_t
則生成的檔案應該是正確的:
zip_t* zip = zip_open("test.zip", ZIP_CREATE, &err);
std::stringstream ss;
document->save(ss, " ");
std::string buffer = ss.str();
auto src = zip_source_buffer_create(buffer.c_str(),buffer.length(),0,0);
zip_file_add(zip,"Document.xml",src,ZIP_FL_ENC_UTF_8);
zip_close(zip); // lifetime of zip_t ends here (which will also end the lifetime of the zip_source_t)
// lifetime of buffer ends at end of scope
推薦
沒有辦法知道zip_source_t
它將存活多長時間(它是參考計數的),因此很難知道您需要保持緩沖區存活多長時間。
因此,我建議將記憶體zip_source_t
分別分配給 withmalloc()
并傳遞freep=1
給zip_source_buffer_create()
.
這樣,只要緩沖區zip_source_t
還活著,緩沖區就會保持有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508351.html
下一篇:c 異步多任務實作