Prawdopodobnie przekroczenie pamięci
Ostatnio zmodyfikowano 2014-04-09 07:24
Frangles Temat założony przez niniejszego użytkownika |
Prawdopodobnie przekroczenie pamięci » 2014-04-08 22:48:56 witam, mam program w c++ lecz nie kompiluje sie prawdopodobnie przez wyjscie poza pamiec. nie bardzo wiem w ktorym momencie Plik Test.cpp #include "wierszyk.h" #include <cstdlib> #include <iostream> #include <string> #include <cstring>
using namespace std;
int main( int argc, char * argv[] ) { int b = 0, n = 0, x; n = atoi( argv[ 1 ] ); WTP * wiersz; if( n >= 0 ) { try { wiersz = new WTP( n ); } catch( string s ) { cout << s; return 0; } for( int i = 2; i < n; i++ ) { try { b = atoi( argv[ i ] ); x = wiersz->wspolczynnik( b ); } catch( string s2 ) { cout << s2; continue; } delete wiersz; } } return 0; }
Plik WTP.cpp #include <stdlib.h> #include <iostream> #include "wierszyk.h"
using namespace std;
WTP::WTP( int n ) throw( string ) { if( n < 0 ) throw( string ) "blad, n<0"; rozmiar = n + 1; tab = new int[ n + 1 ]; for( int i = 0; i <= n; i++ ) { tab[ i ] = 0; } tab[ 0 ] = 1; for( int i = 0; i < n; i++ ) { for( int j = i + 1; j > 0; j-- ) { tab[ j ] = tab[ j ] + tab[ j - 1 ]; } } }
int WTP::wspolczynnik( int m ) throw( string ) { if( m < 0 || m >= rozmiar + 1 ) throw( string ) "blad zakresu"; return tab[ m ]; }
WTP::~WTP() { delete tab; } Plik wierszyk.h #ifndef wierszyk #define wierszyk #include <stdlib.h> #include <iostream>
using namespace std;
class WTP { private: int * tab; int rozmiar; public: WTP( int n ) throw( string ); ~WTP(); int wspolczynnik( int m ) throw( string ); };
#endif
bad reloc address 0x0 in section `.data' final link failed: Invalid operation [Error] ld returned 1 exit status
Zamiarem tego programu jest tworzenie wiersza trojkata pascala dla pierwszego elementu, a nastepnie dla kolejnych argumentow wypisanie odpowiednich elementow tego wiersza. Gdy probowalem dodać obsługę wyjątku, że argument jest tekstem, a nie liczbą program się posypał i nie działa. |
|
Monika90 |
» 2014-04-09 07:24:36 Wygląda na to, że próbujesz zlinkować nie takie pliki jak powinieneś - zła konfiguracja projektu? Natomiast w samym programie (co nie ma związku z błędem): #ifndef wierszyk #define wierszyk
źle - w nazwach makr używaj tylko wielkich liter źle - dyrektywa using w globalnej przestrzeni nazw w pliku nagłówkowym - okropne! WTP( int n ) throw( string ); int wspolczynnik( int m ) throw( string );
źle - specyfikacje wyjatków są deprecated, na dodatek nie używa się std::string jako wyjątku, w standardowej bibliotece są specjalne klasy do tego (albo zdefiniuj sobie własną). class WTP { int * tab; };
źle - klasa zarządza zasobami, a nie ma deklaracji konstruktora kopiującego, ani operatora przypisania, dodaj WTP( const WTP & ) = delete; WTP & operator =( const WTP & ) = delete;
źle - wywołujesz new tylko raz, a delete wiele razy w pętli. I po co w ogóle używasz tu pamięci dynamicznej? |
|
« 1 » |