2017-09-08 9 views
0

私は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データバッファ?

+0

バッファーにunique_ptrを使用し、外部からメモリーを送信する必要がある場合は、これ以上心配する必要はありません。そうでない場合は、以下のコメントにしてください。 – xaxxon

+0

'DataBuffer :: buffer'については、それを[' std :: vector'](http://en.cppreference.com/w/cpp/container/vector)にしてみませんか?次に、手動でのメモリ割り当てや割り当て解除について心配する必要はありません。 –

+2

さらにあなたの問題に関連して、あなたの質問を編集してValgrindの出力の多くを、好ましくはすべてのものを、一致する[最小限で、完全で、検証可能な例](http://stackoverflow.com/help/mcve)に含めてください。また、デバッグ情報(コンパイル時に '-g'フラグを追加)でプログラムをビルドすると、Valgrindはファイル名と行番号を伝えることができます。 –

答えて

0

free()/ delete/delete []が一致しないと、割り当て機能と割り当て解除機能が混在しています。例えば

あなたは

  • mallocに割り当て、newに割り当て、new[]に割り当て、freeまたはdelete
  • と割り当て解除 freeまたは delete[]
  • と割り当て解除deleteまたはdelete[]
  • で割り当てを解除することができ

(などのcallocとでposix_memalignなど、いくつかのより多くの割り当て関数があることに注意してください)

これは、リークなどにつながることができますが、newに割り当て、freeを解放した場合、デストラクタは、間接的なリークが発生呼び出されません。

これにより、メモリが破損しクラッシュする可能性もあります。たとえば、mallocとnewを、異なるメモリプールを使用するバージョンに置き換えるとします。この場合、関数を使用して誤ったプールからメモリを解放すると、そのプールが破損する可能性があります。

最後に、これは誤った警告である可能性があります。特に、最適化されたコードでインライン化できる置換関数がある場合、Valgrindは呼び出しスタック内でインライン関数を認識しません。最適化せずにコンパイルしたり、フラグがない場合は、この可能性を排除できるはずです。

+0

説明をいただきありがとうございます – GiantGeorge

関連する問題