Pokaż wyniki 1 do 4 z 4

Temat: [C++] dynamiczna alokacja pamieci

  1. #1
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie [C++] dynamiczna alokacja pamieci

    Chcialabym stworzyc funkcje, ktora bedzie alokowala dynamicznie pamiec i funkcje zwalniajaca pamiec:

    Napisalam nastepujacy kod:
    plik array.cpp:
    Kod:
    #include "array.h"
    #include<iostream>
    using namespace std;
    
    double **new_array(double **A, int m, int n)
    {
       A=new double *[m];
      for (int i=0;i<m;i++) A[i]=new double[n];
    
     return A;
    }
    
    void del_array(double **A, int m)
    {
     for(int i=0;i<m;i++) delete [] A[i];
      delete []A;
    }
    Plik array.h ma postac:
    Kod:
    #ifndef alloc_h_
    #define alloc_h_
    
    double **new_array(double **A, int m, int n);
    void del_array(double **A, int m);
    
    #endif
    i w pliku main.cpp wywoluje powyzsze funkcje:
    Kod:
    #include "array.h"
    #include<iostream>
    using namespace std;
    
    
    int main()
    {
      double **T;
      int m=3;
      int n=3;
    
      new_array(T,m,n);
      del_array(T, m);
    }


    Program sie kompiluje, ale po uruchomieniu otrzymuje: Segmentation fault

    Sprawdzilam debbugerem, gdzie sie sypie i otrzymalam:
    #0 0xb7dd2eee in free () from /lib/i386-linux-gnu/libc.so.6
    #1 0xb7f8c80f in operator delete(void*) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
    #2 0xb7f8c86b in operator delete[](void*) () from /usr/lib/i386-linux-gnu/libstdc++.so.6
    #3 0x080485cb in del_array (A=0xb7edaff4, m=3) at array.cpp:15
    #4 0x08048695 in main () at main.cpp:14

    Jednakze nie wiem dokladnie dlaczego sypie sie funkcja del_array

    Bede niezmiernie wdzieczna za wskazanie mojego bledu/bledow.

    Pozdr!
    Ostatnio edytowane przez Gosik : 03-10-2013 - 22:25

  2. #2
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Post

    del_array się sypie bo nie dostaje poprawnego wskaźnika.
    new_array zwraca wskaźnik na zaalokowaną pamięć, ale go nie zapisujesz. Zmienna T jest przekazywana do new_array przez wartość, new_array działa na lokalnej kopii i nie modyfikuje oryginalnej zmiennej T.
    Zapisuj wartość zwracaną z new_array (w tym przypadku możesz wyrzucić pierwszy argument new_array bo nie jest do niczego potrzebny), albo przekazuj referencję lub wskaźnik do docelowej zmiennej
    Kod:
    double **new_array(double ** & A, int m, int n)
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  3. #3
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Bardzo dzikuje za pomoc. Jednakze mam jeszcze jedno pytanie, czy w funkcji del_array rowniez powinnam zostosowac referencje? Czy juz wystarczy sam wskaznik?

  4. #4
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Post

    Cytat Napisał Gosik Zobacz post
    czy w funkcji del_array rowniez powinnam zostosowac referencje?
    Niekoniecznie.
    Referencję stosuje się gdy potrzebujesz zmienić oryginalną zmienną (np. w new_array zapisujesz adres zaalokowanej pamięci) lub nie potrzebujesz zmieniać ale kopiowanie jej byłoby zbyt kosztowne a nie jest potrzebne (wtedy zwykle stosuje się referencję na stałą).
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj