Strona 1 z 1

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

: 11 gru 2009, 15:32
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:

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

: 11 gru 2009, 16:47
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/

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

: 11 gru 2009, 18:15
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)

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

: 11 gru 2009, 19:32
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!

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

: 11 gru 2009, 20:10
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.

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

: 14 gru 2009, 10:51
autor: spartanin
dzięki za pomoc jeszcze raz :grin:

pozdrawiam

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