| | 319 | |
| | 320 | === Detect Memory Leaks === |
| | 321 | |
| | 322 | Example code: (this code has a bug) |
| | 323 | |
| | 324 | {{{#!c++ |
| | 325 | #include <iostream> |
| | 326 | #include <cstring> |
| | 327 | |
| | 328 | char * foo() { |
| | 329 | char *a = new char[200]; |
| | 330 | std::strcpy(a, "hello workshop"); |
| | 331 | return a; |
| | 332 | } |
| | 333 | |
| | 334 | int main() { |
| | 335 | char * a = foo(); |
| | 336 | char * b = foo(); |
| | 337 | std::cout << "a = " << a << std::endl; |
| | 338 | std::cout << "b = " << b << std::endl; |
| | 339 | return 0; |
| | 340 | } |
| | 341 | }}} |
| | 342 | |
| | 343 | {{{#!bash |
| | 344 | [fuji@cypress1 TestCodes]$ icpc -g mleak.cpp |
| | 345 | [fuji@cypress1 TestCodes]$ valgrind --leak-check=full ./a.out |
| | 346 | ==10272== Memcheck, a memory error detector |
| | 347 | ==10272== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. |
| | 348 | ==10272== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info |
| | 349 | ==10272== Command: ./a.out |
| | 350 | ==10272== |
| | 351 | a = hello workshop |
| | 352 | b = hello workshop |
| | 353 | ==10272== |
| | 354 | ==10272== HEAP SUMMARY: |
| | 355 | ==10272== in use at exit: 400 bytes in 2 blocks |
| | 356 | ==10272== total heap usage: 2 allocs, 0 frees, 400 bytes allocated |
| | 357 | ==10272== |
| | 358 | ==10272== 200 bytes in 1 blocks are definitely lost in loss record 1 of 2 |
| | 359 | ==10272== at 0x4C28192: operator new[](unsigned long) (vg_replace_malloc.c:363) |
| | 360 | ==10272== by 0x4009D8: foo() (mleak.cpp:5) |
| | 361 | ==10272== by 0x400A0F: main (mleak.cpp:11) |
| | 362 | ==10272== |
| | 363 | ==10272== 200 bytes in 1 blocks are definitely lost in loss record 2 of 2 |
| | 364 | ==10272== at 0x4C28192: operator new[](unsigned long) (vg_replace_malloc.c:363) |
| | 365 | ==10272== by 0x4009D8: foo() (mleak.cpp:5) |
| | 366 | ==10272== by 0x400A20: main (mleak.cpp:12) |
| | 367 | ==10272== |
| | 368 | ==10272== LEAK SUMMARY: |
| | 369 | ==10272== definitely lost: 400 bytes in 2 blocks |
| | 370 | ==10272== indirectly lost: 0 bytes in 0 blocks |
| | 371 | ==10272== possibly lost: 0 bytes in 0 blocks |
| | 372 | ==10272== still reachable: 0 bytes in 0 blocks |
| | 373 | ==10272== suppressed: 0 bytes in 0 blocks |
| | 374 | ==10272== |
| | 375 | ==10272== For counts of detected and suppressed errors, rerun with: -v |
| | 376 | ==10272== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 6 from 6) |
| | 377 | }}} |
| | 378 | |