我有两个文件:
// event_test_delete.cpp
#include <event.h>
int main() {
event_base* ev;
ev = event_init();
delete ev;
return 0;
}
和
// event_test_free.cpp
#include <event.h>
#include <cstdlib>
int main() {
event_base* ev;
ev = event_init();
free(ev);
return 0;
}
当我编译(g++ event_test_delete.cpp -levent -o event_test_delete.o
) event_test_delete.cpp 时,我得到一个错误:
event_test_delete.cpp:在函数“int main()”中: event_test_delete.cpp:8:9:警告:在调用删除运算符时检测到可能的问题: event_test_delete.cpp:5:14:警告:“ev”类型不完整 /usr/include/event.h:211:8: 警告: 'struct event_base' 的前向声明 event_test_delete.cpp:8:9: 注意:析构函数和特定于类的操作符 delete 都不会被调用,即使它们是在定义类时声明的。
但是当我编译g++ event_test_free.cpp -levent -o event_test_free.o
event_test_free.cpp 我没有得到同样的错误,为什么?
第二个问题是(使用 valgrind)为什么会出现内存泄漏?
第一个文件的 Valgrind 输出:(为什么这里是一个Mismatched free() / delete / delete []
?)
azat:~/Desktop/event_test$ valgrind --show-reachable=yes --leak-check=full ./event_test_delete.o ==4135== Memcheck,内存错误检测器 ==4135== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==4135== 使用 Valgrind-3.6.0.SVN-Debian 和 LibVEX;使用 -h 重新运行以获取版权信息 ==4135== 命令:./event_test_delete.o ==4135== ==4135== 不匹配的 free() / delete / delete [] ==4135== 在 0x4023881:操作员删除(void*)(vg_replace_malloc.c:387) ==4135== by 0x8048571: main (in /home/azat/Desktop/event_test/event_test_delete.o) ==4135== 地址 0x4323028 是分配的大小为 944 的块内的 0 个字节 ==4135== 在 0x402328F: calloc (vg_replace_malloc.c:467) ==4135== 0x4047DA7:event_base_new(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4135== by 0x4047EF6: event_init (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x8048561: main (in /home/azat/Desktop/event_test/event_test_delete.o) ==4135== ==4135== ==4135== 堆摘要: ==4135== 在退出时使用:5 个块中的 672 个字节 ==4135== 总堆使用量:6 次分配,1 次释放,分配 1,616 字节 ==4135== ==4135== 1 个块中的 8 个字节在丢失记录 1 of 5 中间接丢失 ==4135== 在 0x4023F50:malloc (vg_replace_malloc.c:236) ==4135== 由 0x4047C7D:event_base_priority_init(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4135== by 0x4047E8B: event_base_new (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x4047EF6: event_init (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x8048561: main (in /home/azat/Desktop/event_test/event_test_delete.o) ==4135== ==4135== 1 个块中的 12 个(4 个直接,8 个间接)字节在 5 个丢失记录 2 中肯定丢失 ==4135== 在 0x402328F: calloc (vg_replace_malloc.c:467) ==4135== by 0x4047C2D: event_base_priority_init (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x4047E8B: event_base_new (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x4047EF6: event_init (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x8048561: main (in /home/azat/Desktop/event_test/event_test_delete.o) ==4135== ==4135== 1 个块中的 256 个字节在丢失记录 3 of 5 中间接丢失 ==4135== 在 0x402328F: calloc (vg_replace_malloc.c:467) ==4135== 由 0x4056192: ??? (在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4135== 0x4047E46:event_base_new(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4135== by 0x4047EF6: event_init (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x8048561: main (in /home/azat/Desktop/event_test/event_test_delete.o) ==4135== ==4135== 1 个块中的 384 个字节在丢失记录 4 of 5 中间接丢失 ==4135== 在 0x4023F50:malloc (vg_replace_malloc.c:236) ==4135== 由 0x405616C: ??? (在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4135== 0x4047E46:event_base_new(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4135== by 0x4047EF6: event_init (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x8048561: main (in /home/azat/Desktop/event_test/event_test_delete.o) ==4135== ==4135== 1 个块中的 660(20 个直接,640 个间接)字节在丢失记录 5 of 5 中肯定丢失了 ==4135== 在 0x402328F: calloc (vg_replace_malloc.c:467) ==4135== 由 0x4056157: ??? (在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4135== 0x4047E46:event_base_new(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4135== by 0x4047EF6: event_init (在/usr/lib/libevent-1.4.so.2.1.3) ==4135== by 0x8048561: main (in /home/azat/Desktop/event_test/event_test_delete.o) ==4135== ==4135== 泄漏摘要: ==4135== 肯定丢失:2 个块中的 24 个字节 ==4135==间接丢失:3块648字节 ==4135== 可能丢失:0 个块中的 0 个字节 ==4135== 仍然可达:0 个块中的 0 个字节 ==4135== 抑制:0 个块中的 0 个字节 ==4135== ==4135== 对于检测到和抑制的错误计数,重新运行:-v ==4135== 错误摘要:3 个上下文中的 3 个错误(抑制:7 个中的 28 个)
对于第二个文件
azat:~/Desktop/event_test$ valgrind --show-reachable=yes --leak-check=full ./event_test_free.o ==4140== Memcheck,内存错误检测器 ==4140== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==4140== 使用 Valgrind-3.6.0.SVN-Debian 和 LibVEX;使用 -h 重新运行以获取版权信息 ==4140== 命令:./event_test_free.o ==4140== ==4140== ==4140== 堆摘要: ==4140== 退出时使用:5 个块中的 672 个字节 ==4140== 总堆使用量:6 次分配,1 次释放,分配 1,616 字节 ==4140== ==4140== 1 个块中的 8 个字节在丢失记录 1 of 5 中间接丢失 ==4140== 在 0x4023F50:malloc (vg_replace_malloc.c:236) ==4140== 由 0x4047C7D:event_base_priority_init(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== by 0x4047E8B: event_base_new (在/usr/lib/libevent-1.4.so.2.1.3) ==4140== 由 0x4047EF6:event_init(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== by 0x8048531: main (in /home/azat/Desktop/event_test/event_test_free.o) ==4140== ==4140== 1 个块中的 12 个(4 个直接,8 个间接)字节在 5 个丢失记录 2 中肯定丢失 ==4140== 在 0x402328F: calloc (vg_replace_malloc.c:467) ==4140== 由 0x4047C2D:event_base_priority_init(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== by 0x4047E8B: event_base_new (在/usr/lib/libevent-1.4.so.2.1.3) ==4140== 由 0x4047EF6:event_init(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== by 0x8048531: main (in /home/azat/Desktop/event_test/event_test_free.o) ==4140== ==4140== 1 个块中的 256 个字节在丢失记录 3 of 5 中间接丢失 ==4140== 在 0x402328F: calloc (vg_replace_malloc.c:467) ==4140== 由 0x4056192: ??? (在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== 0x4047E46:event_base_new(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== 由 0x4047EF6:event_init(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== by 0x8048531: main (in /home/azat/Desktop/event_test/event_test_free.o) ==4140== ==4140== 1 个块中的 384 个字节在丢失记录 4 of 5 中间接丢失 ==4140== 在 0x4023F50:malloc (vg_replace_malloc.c:236) ==4140== 由 0x405616C: ??? (在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== 0x4047E46:event_base_new(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== 由 0x4047EF6:event_init(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== by 0x8048531: main (in /home/azat/Desktop/event_test/event_test_free.o) ==4140== ==4140== 1 个块中的 660(20 个直接,640 个间接)字节在 5 个丢失记录 5 中肯定丢失 ==4140== 在 0x402328F: calloc (vg_replace_malloc.c:467) ==4140== 由 0x4056157: ??? (在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== 0x4047E46:event_base_new(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== 由 0x4047EF6:event_init(在 /usr/lib/libevent-1.4.so.2.1.3 中) ==4140== by 0x8048531: main (in /home/azat/Desktop/event_test/event_test_free.o) ==4140== ==4140== 泄漏摘要: ==4140== 肯定丢失:2 个块中的 24 个字节 ==4140==间接丢失:3块648字节 ==4140== 可能丢失:0 个块中的 0 个字节 ==4140== 仍然可以访问:0 个块中的 0 个字节 ==4140== 抑制:0 个块中的 0 个字节 ==4140== ==4140== 对于检测到和抑制的错误计数,重新运行:-v ==4140== 错误摘要:来自 2 个上下文的 2 个错误(抑制:7 个中的 28 个)