Valgrind a špatné volání memset

asd

Valgrind a špatné volání memset
« kdy: 19. 11. 2011, 17:08:17 »
Zdravim,

Kód: [Vybrat]
    1 #include <iostream>
    2 #include <cstring>
    3 #include <vector>
    4
    5 using namespace std;
    6
    7 struct foo
    8 {
    9     int n;
   10     char str[20];
   11 };
   12
   13 typedef vector<vector<foo*>*>* TreePtr;
   14
   15 int main()
   16 {
   17     TreePtr *** tree = new TreePtr**[10];
   18
   19     for (int i = 0; i < 10; i++)
   20     {
   21         tree[i] = new TreePtr*[10];
   22
   23         for (int j = 0; j < 10; j++)
   24         {
   25             tree[i][j] = new TreePtr[10];
   26
   27             memset(tree[i][j], 0, 10);
   28         }
   29     }
   30
   31     if (!tree[1][2][3])
   32         cout << 0 << endl;
   33
   34     for (int i = 0; i < 10; i++)
   35     {
   36         for (int j = 0; j < 10; j++)
   37         {
   38             delete [] tree[i][j];
   39         }
   40
   41         delete [] tree[i];
   42     }
   43
   44     delete [] tree;
   45
   46     return 0;
   47 }

vsetko by sa, podla mna, zdalo vporiadku ale ked to prejdem valgrindom tak mi vyhodi takyto vystup:

Kód: [Vybrat]
$ valgrind ./hm
==13773== Memcheck, a memory error detector
==13773== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==13773== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==13773== Command: ./hm
==13773==
==13773== Conditional jump or move depends on uninitialised value(s)
==13773==    at 0x400978: main (in /home/gman/hm)
==13773==
0
==13773==
==13773== HEAP SUMMARY:
==13773==     in use at exit: 0 bytes in 0 blocks
==13773==   total heap usage: 111 allocs, 111 frees, 8,880 bytes allocated
==13773==
==13773== All heap blocks were freed -- no leaks are possible
==13773==
==13773== For counts of detected and suppressed errors, rerun with: -v
==13773== Use --track-origins=yes to see where uninitialised values come from
==13773== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)

predsa tie ukazovatele v tree[i ][j][k] su inicializovane (na 0). Alebo sa to nepoklada za inicializaciu? Cize chcem sa spytat ako by sa dalo spravit aby som mal taketo 3-rozmerne pole ukazovatelov a kontrolovat ci ten-ktory ukazovatel ukazuje niekde zmysluplne alebo nie (0).
« Poslední změna: 20. 11. 2011, 19:50:12 od Petr Krčmář »


anon

Re: Valgrind: Conditional jump or move depends on uninitialised value(s)
« Odpověď #1 kdy: 19. 11. 2011, 17:37:14 »
Volání memset() se zdá být špatně, správně by mělo být:

Kód: [Vybrat]
memset(tree[i][j], 0, 10 * sizeof(TreePtr));

asd

Re: Valgrind: Conditional jump or move depends on uninitialised value(s)
« Odpověď #2 kdy: 19. 11. 2011, 17:52:38 »
anon: Dakujem :)