Valgrind Memcheck工具报告MISS MATCH delete for C ,但删除操作在另一个类/结

Valgrind memcheck tool report miss match delete for c++, but delete operation is in another class/struct

本文关键字:操作 删除 另一个 报告 工具 Memcheck MISS MATCH for delete Valgrind      更新时间:2023-10-16

我在data_buf.h中有一个结构:

struct DataBuffer {
  uint8_t* buffer;
  size_t buf_size;
  size_t data_start;
  size_t data_len;
  int dst_offset;
  DataBuffer(uint8_t* buf, size_t sz, size_t ds, size_t dl, int doff);
  ~DataBuffer();
};

data_buf.cpp

DataBuffer::DataBuffer(uint8_t* buf, size_t sz,
                   size_t ds, size_t dl,
                   int doff)
  :buffer{buf},
   buf_size{sz},
   data_start{ds},
   data_len{dl},
   dst_offset{doff} {}
DataBuffer::~DataBuffer() {
  if (buffer) {
  delete [] buffer;
  }
}

所以在类data_proc_hdl.h中 #include" data_buf.h"

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,

so:

ClientHandler* u = new ClientHandler(10);
u->do_something();
delete u;

我认为还可以,分配的数据缓冲区将在Databuffer的破坏者,但valgrind ut fut:

==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: 是真的吗,存在内存泄漏,或者仅仅是因为它不是这样管理数据缓冲区的好设计?

不匹配的free()/delete/delete []表示您正在混合分配和交易函数。

例如,您可以是

  • 分配malloc并用deletedelete[]
  • 进行交易
  • 分配new并用freedelete[]
  • 进行交易
  • 分配new[]并与freedelete
  • 进行交易

(请注意,还有更多分配功能,例如Calloc和posix_memalign)

这可能会导致泄漏,例如,如果您分配了new并与free进行交易,则将不会被称为间接泄漏。

这也可能导致内存损坏并崩溃。例如,如果您用使用不同内存池的版本替换Malloc和New。在这种情况下

最后,这可能是一个错误的警报。特别是,如果您具有可能在优化的代码中插入的任何替换功能,则Valgrind将不会在呼叫列表中看到嵌入的函数。如果您没有优化或"无内线"标志进行编译,则应该能够消除这种可能性。