program na udostępnienie pamięci

0

Witam miałem do zamiany taki program z C na C++:

 #include <stdlib.h>
#include <stdio.h>
int main()
{
    int *tablica;
        if ((tablica = (int *) malloc(50*sizeof(int))) == NULL)
        {
            printf("za malo pamieci!!!\n");
            exit(1);
        }        
        printf("operacja przydzielenia pamieć została pomyślnie zakończona\n");
    return 0;
}

i zrobiłem to tak:

#include <iostream>
#include <new>
#include <cstdio>

using namespace std;

int main()
{
    try
    {
       int *tab = new int[50];
       cout << "rozmiar " << 50*sizeof( *tab );
    }
    catch(std::bad_alloc)
    {
        cout << "brak pamięci" << endl;
    }
    return 0;
} 

I jak dobrze rozumiem takie coś można używać w programach by sprawdzić czy tablice na których pracujemy mieszczą się w pamięci np. jak zadeklarujemy dla tablicy 50 bitów to po przekroczeniu dostaniemy komunikat o braku pamięci? Ale nie wiem czy dobrze to zrozumiałem.

1
  1. W praktyce nie wszędzie możesz polegać na std::bad_alloc
  2. Nie przyjmuj wyjątku przez kopię, tylko przez referencję, najlepiej const(std::bad_alloc const&)
  3. W C++ masz kontenery i smart pointery - używaj ich (std::vector<int> w tym przypadku)
0

czyli powinno być tak:

 
#include <iostream>
#include <new>
#include <cstdio>
 
using namespace std;
 
int main()
{
    try
    {
       int *tab = new int[50];
       cout << "rozmiar " << 50*sizeof( *tab );
    }
    const(std::bad_alloc const&)
    {
        cout << "brak pamięci" << endl;
    }
    delete[] tab;
    return 0;
} 

I mam pytanie co do stosów(kontenerów) czy teraz ich się najczęściej używa zamiast new??

2

Pamiętaj o

delete[] tab; 

.
new i delete to proszenie się o błędy. Jest std::vector i bezpieczne wskaźniki.

I mam pytanie co do stosów(kontenerów) czy teraz ich się najczęściej używa zamiast new??

Są bezpieczniejsze i nie wolniejsze od gołych tablic dynamicznych.

0

ok jak dojde do vector to bede już używał tylko ich

1
    cout << "brak pamięci" << endl;
    }
    delete[] tab; // nie jest w zasięgu tablicy tab
    return 0; 

1 użytkowników online, w tym zalogowanych: 0, gości: 1