Pokaż wyniki 1 do 6 z 6

Temat: [C++] problem z pamiecia

  1. #1
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie [C++] problem z pamiecia

    Mam pytanie odnosnie alkoacji pamieci w C++.

    Podaczas pisania prostego kodu:

    Kod:
    //....
    //wczytuje macierz c
    //wczytuje macierz TT
    
    double *C = new double [wiersze*wiersze*wiersze*wiersze];
    
            int N =2;
    
            for (int i = 0; i < N; i++)
                    for (int p = 0; p < N; p++)
                            for (int qrs = 0; qrs < 8; qrs++){
                                    C[i*N+qrs] += c[i*N+p]*TT[p*N+qrs];
                            }
    
    double *D = new double [wiersze*wiersze];
               
             for (int i = 0; i < N; i++)
                    for (int j= 0; j< N; j++){
                            D[i*N+j]=2.0;
                    }
    
    
    delete [] C;
    delete [] c;
    delete [] TT;
    delete [] D;
    W takim przypadku po uruchomieniu programu dostaje nastepujacy komunikat:
    Kod:
    terminate called after throwing an instance of 'std::bad_alloc'
      what():  std::bad_alloc
    Aborted
    Czy blad ten wynika z faktu, ze pobieram zbyt duza ilosc pamieci?
    W kolejnych krokach bede potrzebowala macierz C, ktora jest bardzo duza i nie moge od razu jej zwolnic.
    Ostatnio edytowane przez Gosik : 06-09-2013 - 16:51

  2. #2
    Zarejestrowany
    May 2013
    Postów
    59

    Domyślnie

    Cytat Napisał Gosik Zobacz post
    Mam pytanie odnosnie alkoacji pamieci w C++.

    Podaczas pisania prostego kodu:

    Kod:
    //....
    //wczytuje macierz c
    //wczytuje macierz TT
    
    double *C = new double [wiersze*wiersze*wiersze*wiersze];
    
            int N =2;
    
            for (int i = 0; i < N; i++)
                    for (int p = 0; p < N; p++)
                            for (int qrs = 0; qrs < 8; qrs++){
                                    C[i*N+qrs] += c[i*N+p]*TT[p*N+qrs];
                            }
    
    double *D = new double [wiersze*wiersze];
               
             for (int i = 0; i < N; i++)
                    for (int j= 0; j< N; j++){
                            D[i*N+j]=2.0;
                    }
    
    
    delete [] C;
    delete [] c;
    delete [] TT;
    delete [] D;
    W takim przypadku po uruchomieniu programu dostaje nastepujacy komunikat:
    Kod:
    terminate called after throwing an instance of 'std::bad_alloc'
      what():  std::bad_alloc
    Aborted
    Czy blad ten wynika z faktu, ze pobieram zbyt duza ilosc pamieci?
    W kolejnych krokach bede potrzebowala macierz C, ktora jest bardzo duza i nie moge od razu jej zwolnic.
    Tak, prawdopodobnie próbujesz zaalokować za dużo.

  3. #3
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    ok, a jak mozna z tego wybrnac?
    Bede niezmiernie wdzieczna za wszelkie wskazowki.

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

    Post

    Zależy ile potrzebujesz pamięci i jakie ograniczenia ma system, na którym działasz.
    Najprostsza odpowiedź to dodać więcej RAMu (albo chociaż swapu)
    Czasem wymagana ilość pamięci jest dostępna, ale nie można znaleźć odpowiednio długiego jednolitego kawałka przestrzeni adresowej, wiec zamiast alokować jeden duży kawałek, możesz zaalokować kilka mniejszych.
    Jeśli potrzebujesz naprawdę dużo pamięci to możesz trzymać dane w pliku (albo kilku; systemy plików też mają swoje ograniczenia) i potrzebne fragmenty będziesz wczytywała do pamięci operacyjnej i po obróbce z powrotem zapisywała do pliku (możesz to napisać sama albo użyć mapowania plików udostępnianego przez wiele systemów operacyjnych).

    Jak duża ma być ta tablica?
    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.

  5. #5
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Cytat Napisał Rolek Zobacz post
    Jak duża ma być ta tablica?
    Moja tablica cały czas będzie rosła. Im wieksza tym lepiej, wiec mysle, ze pomysl z trzymaniem danych w pliku jest idelany!

    Sadze,ze w tej sytuacji bedzie mi potrzebna biblioteka fstream, do otwarcia pliku -> zapisu danych -> zamkniecia pliku.
    Kiedys slyszalam rowniez o tzw. batchu, ale nie wiem o co w tym chodzi.

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

    Post

    Cytat Napisał Gosik Zobacz post
    Kiedys slyszalam rowniez o tzw. batchu, ale nie wiem o co w tym chodzi.
    Mogłaś słyszeć w dwóch znaczeniach: przetwarzania wsadowego lub pliku wsadowego na windows. Tryb wsadowy, Program wsadowy, Gynvael's BAT - YouTube.
    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