Valgrind Memcheck工具报告MISS MATCH delete for C ,但删除操作在另一个类/结
Valgrind memcheck tool report miss match delete for c++, but delete operation is in another class/struct
我在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
并用delete
或delete[]
进行交易 - 分配
new
并用free
或delete[]
进行交易 - 分配
new[]
并与free
或delete
进行交易
(请注意,还有更多分配功能,例如Calloc和posix_memalign)
这可能会导致泄漏,例如,如果您分配了new
并与free
进行交易,则将不会被称为间接泄漏。
这也可能导致内存损坏并崩溃。例如,如果您用使用不同内存池的版本替换Malloc和New。在这种情况下
最后,这可能是一个错误的警报。特别是,如果您具有可能在优化的代码中插入的任何替换功能,则Valgrind将不会在呼叫列表中看到嵌入的函数。如果您没有优化或"无内线"标志进行编译,则应该能够消除这种可能性。
相关文章:
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 如何修复重新平衡时AVL删除操作中的分段错误?
- C++数组指针上的删除操作
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 从对象成员函数内部删除操作的技术 /设计模式
- QT从Qmenu删除操作,以后再添加
- 涉及删除操作的 C++ 指针问题
- 为什么C++允许您移动包含已删除移动操作的对象的类
- 在 C++ 中使用 try-catch 进行删除 [] 或删除操作是否必要
- 在remove_if删除元素之前,我可以滥用谓词对元素执行操作吗
- 如何删除模板类的输出操作程序重载的错误
- Valgrind Memcheck工具报告MISS MATCH delete for C ,但删除操作在另一个类/结
- 类数组 - 删除操作
- 在新的 c++11 项目中,我是否应该默认删除任何操作
- 删除运算符的确切操作
- 在以下代码中执行删除操作时,我无法获得以下代码中返回的正确值
- C++删除操作相关查询
- ofstream-需要在close()操作后删除对象句柄
- 一个空的别名shared_ptr是一个很好的替代无操作删除shared_ptr吗?
- unique_ptr没有操作删除