私はdata_buf.hで構造体を持っている別のクラス/構造体でありますクラスdata_proc_hdl.h: の#include "data_buf.h"ValgrindのmemcheckツールレポートミスマッチC++用の削除が、削除操作は
class DataProcessHandler {
public:
DataProcessHandler(int buf_len);
private:
DataBuffer m_data;
}
コンストラクタは次のようになります。
DataProcessHandler::DataProcessHandler(int buf_len)
:m_data{new uint8_t[buf_len], buf_len, 0, 0, -1} {}
クラス使用のための自己定義デストラクタはありません。
そしてClientHandlerのはDataProcessHandlerに由来し、
ので:
ClientHandler* u = new ClientHandler(10);
u->do_something();
delete u;
私はそれはOKだと思う、データ・バッファが割り当てられたDataBufferの デストラクタで解放されますが、Valgrindのアウトプット:
==12419== Mismatched free()/delete/delete []
==12419== at 0x49421D4: operator delete[](void*) (vg_replace_malloc.c:621)
==12419== by 0x10EABB: ~DataProcessHandler (data_proc_hdl.h:19)
==12419== by 0x10EABB: ClientHandler::~ClientHandler() (client_hdl.cpp:81)
==12419== by 0x10EAE3: ClientHandler::~ClientHandler() (client_hdl.cpp:62)
==12419== by 0x112EF3: ClientManager::process_client_disconn(ClientHandler*) (client_mgr.cpp:85)
==12419== by 0x126153: Multiplexer::run() (multiplexer.cpp:182)
==12419== by 0x11515F: main (cp_log.cpp:93)
==12419== Address 0x4be50b0 is 0 bytes inside a block of size 256 alloc'd
==12419== at 0x4940660: malloc (vg_replace_malloc.c:299)
==12419== by 0x49FC5EB: operator new(unsigned long) (in /system/lib64/libc++.so)
==12419== by 0x116E9B: DataProcessHandler::DataProcessHandler(int, LogController*, Multiplexer*, unsigned long) (data_proc_hdl.cpp:18)
==12419== by 0x10E853: ClientHandler::ClientHandler(int, LogController*, Multiplexer*, ClientManager*) (client_hdl.cpp:50)
==12419== by 0x112E07: ClientManager::process(int) (client_mgr.cpp:71)
==12419== by 0x126153: Multiplexer::run() (multiplexer.cpp:182)
==12419== by 0x11515F: main (cp_log.cpp:93)
Qestion: メモリリークがありますか、それともmこのようなanageデータバッファ?
バッファーにunique_ptrを使用し、外部からメモリーを送信する必要がある場合は、これ以上心配する必要はありません。そうでない場合は、以下のコメントにしてください。 – xaxxon
'DataBuffer :: buffer'については、それを[' std :: vector'](http://en.cppreference.com/w/cpp/container/vector)にしてみませんか?次に、手動でのメモリ割り当てや割り当て解除について心配する必要はありません。 –
さらにあなたの問題に関連して、あなたの質問を編集してValgrindの出力の多くを、好ましくはすべてのものを、一致する[最小限で、完全で、検証可能な例](http://stackoverflow.com/help/mcve)に含めてください。また、デバッグ情報(コンパイル時に '-g'フラグを追加)でプログラムをビルドすると、Valgrindはファイル名と行番号を伝えることができます。 –