C++ oraz Valgrind

0

Mam za zadanie używając Valgrind'a znaleźć i poprawić błędy w dwóch krótkich kodach, lecz nie mam pojęcia nawet bez używania Valgrind'a co tutaj nie trybi i nie do końca rozumiem te kody, ktoś podpowie / naprowadzi?
PS: Z tego co poczytałem to Valgrind jest tylko na Linux, a nie chce bawić się w virtual box itp. bo czas mi na to nie pozwala.
Kody:
Kod nr 1:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

char *upper;

char *to_upper(const char *str)
{
  char *l = strdup(str);
  char *c;

  for (c = l; *c; c++) {
    if (islower(*c))
      *c = toupper(*c);
  }
  
  return l;
}

int main(int argc, char *argv[])
{
  upper = to_upper(argv[1]);
  
  while (*upper)
    putchar (*(upper++));
  puts ("");
  
  return 0;
}

Kod nr 2:

#include <iostream>
#include <iomanip>

using namespace std;

const double WMIN = -1000.0;
const double WMAX =  1000.0;

struct elem
{
    unsigned nastepnik;
    double   dane;
};

int main(int argc, char *argv[])
{
  int N = atoi(argv[1]);

  elem *L;
  double *d,we,szkb;
  int *K,ikb,ine,ip,ib,i,j;

  L = new elem[N + 1];
  d = new double[N];
  K = new int[N - 1];

  cout.precision(2);     // 2 cyfry po przecinku
  cout.setf(ios::fixed); // format staloprzecinkowy

  // Generujemy zawartosc tablicy d[] i wyswietlamy ja
  cout << "Przed sortowaniem:" << endl;
  srand((unsigned)time(NULL));
  for(i = 0; i < N; i++)
  {
    d[i] = WMIN + (double)rand() / (double)(RAND_MAX+1) * (WMAX - WMIN);
    cout << d[i] << " ";
  }
  cout << endl;

  // Zerujemy kubelki
  for(i = 0; i <= N; i++)
    K[i] = 0;

  // Obliczamy szerokosc kubelka
  szkb = (WMAX - WMIN) / N;
  //ine  = 1;

  // Rozrzucamy poszczegolne elementy d[i] na listach K[]
  for(i = 0; i < N; i++)
  {
    we  = d[i];
    ikb = (int)((we - WMIN) / szkb);
    L[ine].nastepnik = 0;
    L[ine].dane = we;
    ip = 0; ib = K[ikb];
    while((ib > 0) && (L[ib].dane < we))
    {
      ip = ib;
      ib = L[ib].nastepnik;
    }
    if(!ip)
    {
      L[ine].nastepnik = ib;
      K[ikb] = ine;
    }
    else if(!ib) L[ip].nastepnik = ine;
    else
    {
      L[ip].nastepnik = ine;
      L[ine].nastepnik = ib;
    }
    ine++;
  }

  // wybieramy dane z kubelkow i umieszczamy je w d[]
  j = 0;
  for(ikb = 0; ikb <= N; ikb++)
  {
    i = K[ikb];
    while(i)
    {
      d[j++] = L[i].dane;
      i = L[i].nastepnik;
    }
  }

  // Koniec. Wyswietlamy wyniki
  cout << endl << "Po sortowaniu:" << endl;
  for(i = 0; i < N; i++)
    cout << d[i] << " ";
  cout << endl;

  free(L);
  return 0;
}
 
3

Jak używasz MinGW to zainteresuj się Address Sanitizerem (przełącznik przy kompilacji). Jeśli w VC to Visual Leak Detector.

Problemem jest to, że alokujesz pamięć i jej nie zwalniasz (być może więcej problemów jest, to na szybko można zauważyć).

3

...Z tego co poczytałem to Valgrind jest tylko na Linux, a nie chce bawić się w virtual box itp. bo czas mi na to nie pozwala.

Czyli kochani moi forumowicze znajdźcie wycieki pamięci w kodzie za mnie (joke) :)

  • Instalujesz VBoksa;
  • Instalujesz Xubuntu, bo mały i szybko wchodzi;
  • Instalujesz valgrind bez konsoli, nawet przez Menedżer oprogramowania;
  • Instalujesz QtCreator'a, bo to jedno z lepszych IDE co C/C++ dla Linuksa;
  • Piszesz program;
  • Uruchamiasz tak jak tutaj: http://stackoverflow.com/questions/5134891/how-do-i-use-valgrind-to-find-memory-leaks
  • ...a nawet możesz darować sobie wszystkie parametry i zrobić po prostu valgrind ./your_program.
  • Dużo się uczysz mówiąc "A to naprawdę tutaj jest wyciek?"

Pierwsze cztery punkty zajmą Ci maks godzinkę, a często valgrind wskaże Ci błąd wręcz co do linijki.

Ba Dum Tsssss!

PS: Mała podpowiedź do Twojego kodu: Nie używa się new razem z free :) No i... jak się już użyje new to raczej trzeba by zrobić delete albo delete[] - to nie Java czy C# :) No i wiesz... możesz też popatrzyć czy czasem nie używasz jakiejś funkcji, która zwraca ci coś zaalokowanego dynamicznie. To też trzeba usunąć. Dobrze wiedzieć czy zostało to zaalokowane przez malloc czy przez new i użyć adekwatnego usuwania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1