Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

c++ operator "new" and "delete" in class zarządzanie pamięcią

Ostatnio zmodyfikowano 2022-04-19 18:33
Autor Wiadomość
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

C/C++
#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 )
       
{
           
//tab[i] = (rand() % 100) + 1;
           
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';
   
}
   
   
/*
    iArray * tab;
    cout << "Rezerwuje pamiec za pomoca new" << endl;
    tab = new iArray;
    cout << "Zwalniam pamiec, ktora zostala zarezerwowana za pomoca new" << endl;
    delete tab;
    */
   
   
return 0;
}
P-179411
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).
P-179412
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)
P-179413
« 1 »
  Strona 1 z 1