Skocz do zawartości

Zablokowane Nietypowa alokacja pamięci


Rekomendowane odpowiedzi

Opublikowano

Witam.

 

Krótko i zwięźle, jest taki kod:

// gdzieś w main
unsigned int i;
// pobranie do i liczby naturalnej wpisanej przez użytkownika
char str = new char[i];
// coś tam
delete[] str;
return 0;

wiemy, że i >= 0 (co wynika z typu). Jak i > 0 to ok, alokujemy pamięć. Ale co jak i = 0? Czy alokowanie 0 bajtów wywoła błąd?

Opublikowano

U mnie nie wywołuje błędu, ale logicznie nie mogę się odwołać do pierwszego elementu. Na twoim miejscu zabezpieczyłbym się na wypadek, gdy użytkownik chce podać 0. Nie testowałeś dla i = 0? Zapomniałeś również postawić "*" przed wskaźnikiem str.

Opublikowano

Kod do przemyślenia:

 

int *a = new int;
int *b = new int;

int delta1 = ((int)b - (int)a);


a = new int[0];
b = new int[0];

int delta2 = ((int)b - (int)a);

Checknij sobie wartość delta1 i delta2 w debug i release.

Opublikowano

@mannor

Fakt, kod pisany na szybko, żeby pokazać istotę błędu. Drobna literówka ;) .

 

@Will

delta1 = 128, delta2 = 16 w obu przypadkach. Z kolei przepuszczając przez debugger wynoszą one 176, 32.

Więc? Efekt jest tylko taki, że inaczej rozmieszczana jest pamięć dynamiczna. W pierwszym przypadku są rozmieszczone dalej niż w drugim, mimo to, odległość w drugim przypadku starczy na 4 elementy tablicy statycznej int.

Opublikowano

Jeśli używasz visuala dla wersji debug powinieneś mieć po 64. To nie chodzi o ich położenie tylko o to ile zajmuje alokacja tych dwóch wersji.

Opublikowano

Masz na myśli tyle samo? Czyli czy zaalokujemy tablice 0-elementową, czy jedną zmienną to tyle samo zabierze nam pamięci, chociaż w drugim przypadku nie zapiszemy tam żadnej informacji. Akurat o pamięć mi się tutaj nie rozchodzi, raczej o bezpieczeństwo, ale skoro samo alokowanie nie wywoła błędu, a używanie zabezpieczone jest przez zmienną i (indeks nigdy nie przekroczy i. Skoro i = 0, to nie ma na czym operować ;) ) więc chyba jest dobrze ;) .

 

Dzięki za pomoc ;) .

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...