C++ - (operator new zgłasza wyjątek: std::bad_alloc()) Jak to obejść?

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
spartanin
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 18 paź 2009, 14:13
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

C++ - (operator new zgłasza wyjątek: std::bad_alloc()) Jak to obejść?

Post autor: spartanin »

Witam.
Mam problem z drobnym programem w C++.
Jego kod:

Kod: Zaznacz cały

#include <iostream>


using namespace std;

int main()
{
    int *wsk;
    int Max;
    int *const element0 = wsk;
    wsk = new int[Max];
    cout <<"Podaj liczbe elementow tablicy: ";
    cin >> Max;

    cout <<"Podaj wartosc tablicy\n";
    for (int i=0; i < Max; i++)
    {
        cout <<"Wartosc elementu pod indexem "<<i<<" : ";
        cin >> wsk[i];
    }

    wsk = element0;
    for (int i=0; i < Max; i++)
    {
        cout <<"Element Tab["<<i<<"] i "<<*(wsk++)<<"\t"<< "\n\n";
    }
    delete [] wsk;

    return EXIT_SUCCESS;
}

z tego co czytałem to operator new nie może znaleźć miejsca na stercie... i tyle wiem... szukałem na google, ale nie dowiedziałem sie niczego dodatkowego. :wall:

Może bylibyście mi w stanie pomóc?

Przepisując ten program na Dev C++ i w nim go kompilując wszystko jest ok, aczkolwiek nie mam zamiaru korzystać zbyt często z programów robionych pod winde..:-( i chciałbym bardzo rozwiązać ten problem na Ubuntu. Baaardzo!

Ciekawe, że nawet mój profesor od podst. programowania nie wiedział jak to rozwikłać...:P

Pozdrawiam.:craz:
Awatar użytkownika
Nadril
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 171
Rejestracja: 11 lip 2008, 10:54
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: C++ - (operator new zgłasza wyjątek: std::bad_alloc()) Jak to obejść?

Post autor: Nadril »

Nie kompilowałem, ale nie próbujesz przypadkiem już na samym starcie zrobić

Kod: Zaznacz cały

wsk = new int[Max];
gdzie Max nie jest jeszcze przypisany, czyli w C++ jest chyba zero, nie?

edit:
Tu masz przykład który u mnie działa doskonale wzoruj się :)
http://www.cplusplus.com/doc/tutorial/dynamic/
Awatar użytkownika
Kastagir
Sędziwy Jeż
Sędziwy Jeż
Posty: 89
Rejestracja: 09 sty 2006, 16:36
Płeć: Mężczyzna
Wersja Ubuntu: 17.04
Środowisko graficzne: Inne
Architektura: x86_64

Odp: C++ - (operator new zgłasza wyjątek: std::bad_alloc()) Jak to obejść?

Post autor: Kastagir »

1 rzecz
kolejność, powinno być tak:

Kod: Zaznacz cały

wsk = new int[Max];
int *const element0 = wsk;
2 rzecz
zwalniasz pamięć na którą pokazuje wskaźnik wsk, który wcześniej modyfikowałeś i nie pokazuje już na to na co pokazywał wcześniej (zapewne po to masz zmienną element0)
"Search you should use, my young padawan"
Awatar użytkownika
spartanin
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 18 paź 2009, 14:13
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: C++ - (operator new zgłasza wyjątek: std::bad_alloc()) Jak to obejść?

Post autor: spartanin »

dzięki Nadril za wzór:)

Wyjaśnijcie mi jeszcze dlaczego w windowsowskim środowisku kod spełnia swoją funkcje, a gdy kompiluje go przez g++ wyświetla mi wyjątek bad::alloc... bo tego nie rozumiem!
mikolajs
Wytworny Kaczor
Wytworny Kaczor
Posty: 352
Rejestracja: 15 paź 2008, 18:30
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: KDE Plasma

Odp: C++ - (operator new zgłasza wyjątek: std::bad_alloc()) Jak to obejść?

Post autor: mikolajs »

Wyjaśnijcie mi jeszcze dlaczego w windowsowskim środowisku kod spełnia swoją funkcje, a gdy kompiluje go przez g++ wyświetla mi wyjątek bad::alloc... bo tego nie rozumiem!
Czysty przypadek!

Kod: Zaznacz cały

wsk = new int[Max];
Najpierw zainicjuj Max, bo w tej chwili masz tam "śmieci". Jeżeli przypadkowo znalazła się tam liczba np. 2000000000 to program próbuje statycznie zalokować tablicę o ciągłej długości 8GB, a co jeśli jest tam ujemna liczba? Zresztą raczej nie należy używać statycznej tablicy gdy jej wielkość będzie znana dopiero po uruchomieniu programu.
Awatar użytkownika
spartanin
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 18 paź 2009, 14:13
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: C++ - (operator new zgłasza wyjątek: std::bad_alloc()) Jak to obejść?

Post autor: spartanin »

dzięki za pomoc jeszcze raz :grin:

pozdrawiam

wątek moim zdaniem można uznać za zamknięty:)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości