c++ operator "new" and "delete" in class zarządzanie pamięcią
Ostatnio zmodyfikowano 2022-04-19 18:33
nanoant20 Temat założony przez niniejszego użytkownika |
c++ operator "new" and "delete" in class zarządzanie pamięcią » 2022-04-19 18:20:17 Poniżej zamieszczam listing z napisaną klasą Przy rezerwowaniu pamięci o wartości 0 i powyżej jest o.k. Problem polega na tym, że jeżeli wprowadzę minusową wartość np. -1 dostaje std::bad_alloc() Nie chcę zabezpieczać przy instrukcji std::cin podczas podawaniu rozmiary tablicy. ale w samym konstruktorze, i coś mi nie wychodzi Proszę też o uwagi dotyczące kodu, czy coś dodać, zmienić itp. Na tym etapie nie chcę jeszcze tworzyć własnego vector'a #include <iostream> #include <cstdlib>
using namespace std;
class iArray { private: unsigned * tab; unsigned t_size; public: iArray() { cout << "Konstruktor domyslnny bezparametrowy" << '\n'; this->tab = new unsigned[ 1 ] { 0 }; this->t_size = 0; }; iArray( unsigned t_size ) { if( t_size > 0 ) { cout << "Konstruktor domyslnny" << '\n'; this->tab = new unsigned[ t_size ] { 0 }; this->t_size = t_size; } else if(( t_size < 0 ) ||( t_size == 0 ) ) { this->tab = nullptr; this->t_size = t_size; } } ~iArray() { cout << "~Destructor" << '\n'; delete[ ] tab; }; int size_tab() { return this->t_size; } void fill() { for( unsigned i = 0; i < t_size; ++i ) { cout << i + 1 << " Value: "; cin >> tab[ i ]; } } void print() { for( unsigned i = 0; i < t_size; ++i ) { cout << tab[ i ] << " "; } } };
int main() { srand( time( NULL ) ); int r { 0 }; while(( cout << "Enter size tab : " ) &&( cin >> r ) ) { iArray tab( r ); cout << "Size tab : " << tab.size_tab() << '\n'; tab.fill(); tab.print(); cout << '\n'; } return 0; }
|
|
DejaVu |
» 2022-04-19 18:25:11 Kod zachowuje się poprawnie: int r = - 1; rzutowany do: auto rozmiarDoZaalokowania = static_cast < unsigned >( r ); da Ci rozmiar pamięci na poziomie 0xFFffFFff (dla 32-bitowej architektury), czyli dużo więcej niż masz dostępnego RAM-u. /edit: Jeżeli chcesz obsługiwać ujemne wartości to zmień typ z unsigned na int i wtedy możesz sobie napisać warunek dot. rozmiaru (mniejsze/równe zero). |
|
nanoant20 Temat założony przez niniejszego użytkownika |
» 2022-04-19 18:33:27 @DejaVu dzięki, zmieniłem typ na int, i zadziałało (warunek był postawiony, tylko był rzeczywiście typ unsigned) |
|
« 1 » |