C/C++的内存泄漏检测工具Valgrind memcheck的使用经历(求大神解答疑惑,找出内存泄露真凶)(三)

2014-11-24 10:54:32 · 作者: · 浏览: 12
ock of size 6 alloc'd
==3511== at 0x402C418: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3511== by 0x80484C8: main (in /home/hadoop/test/zero)
==3511==
==3511== Invalid read of size 1
==3511== at 0x40BC3D7: _IO_file_xsputn@@GLIBC_2.1 (fileops.c:1311)
==3511== by 0x4092184: vfprintf (vfprintf.c:1655)
==3511== by 0x409881E: printf (printf.c:34)
==3511== by 0x4063934: (below main) (libc-start.c:260)
==3511== Address 0x420002e is 0 bytes after a block of size 6 alloc'd
==3511== at 0x402C418: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3511== by 0x80484C8: main (in /home/hadoop/test/zero)
==3511==
==3511== Invalid read of size 4
==3511== at 0x40C999C: __GI_mempcpy (mempcpy.S:59)
==3511== by 0x40BC310: _IO_file_xsputn@@GLIBC_2.1 (fileops.c:1329)
==3511== by 0x4092184: vfprintf (vfprintf.c:1655)
==3511== by 0x409881E: printf (printf.c:34)
==3511== by 0x4063934: (below main) (libc-start.c:260)
==3511== Address 0x420002c is 4 bytes inside a block of size 6 alloc'd
==3511== at 0x402C418: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3511== by 0x80484C8: main (in /home/hadoop/test/zero)
==3511==
app name: Alexia
==3511==
==3511== HEAP SUMMARY:
==3511== in use at exit: 0 bytes in 0 blocks
==3511== total heap usage: 1 allocs, 1 frees, 6 bytes allocated
==3511==
==3511== All heap blocks were freed -- no leaks are possible
==3511==
==3511== For counts of detected and suppressed errors, rerun with: -v
==3511== ERROR SUMMARY: 9 errors from 6 contexts (suppressed: 0 from 0)
复制代码
从检测报告可以看出:
strcpy(ap->app_name, s);这句是内存写错误,printf("app name: %s\n", ap->app_name);这句是内存读错误,两者都说明Valgrind认为ap->app_name所处内存空间是不合法的,可是我明明已经为其分配了内存空间,只是没有注明这段空间就是给它用的,难道结构体中零长数组char app_name[0]是不能写入值的吗?还是我对零长数组的使用有误?至今仍不得解,求大神解答……
3. 最不明所以的内存泄露:definitely lost/indefinitely lost
请看下面这样一个程序:
复制代码
#include
#include
class accept_pair {
public:
bool is_accept_state;
bool is_strict_end;
char *app_name;
public:
accept_pair(bool is_accept = false, bool is_end = false);
~accept_pair();
};
class DFA {
public:
unsigned int _size;
accept_pair **accept_states;
public:
DFA(int size);
~DFA();
void add_state(int index, char *s);
void add_size(int size);
};
int main() {
char *s = "Alexia";
DFA *dfa = new DFA(3);
dfa->add_state(0, s);
dfa->add_state(1, s);
dfa->add_state(2, s);
dfa->add_size(2);
dfa->add_state(3, s);
dfa->add_state(4, s);
printf("\napp_name: %s\n", dfa->accept_states[4]->app_name);
printf("size: %d\n\n", dfa->_size);
delete dfa;
return 0;
}
accept_pair::accept_pair(bool is_accept, bool is_end) {
is_accept_state = is_accept;
is_strict_end = is_end;
app_name = NULL;
}
accept_pair::~accept_pair() {
if (app_name) {
printf("delete accept_pair.\n");
delete[] app_name;
}
}
DFA::DFA(int size) {
_size = size;
accept_states = new accept_pair*[_size];
for (int s = 0; s < _size; s++) {