Rudy Opublikowano 19 Lipca 2011 Opublikowano 19 Lipca 2011 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?
Lunatyk Opublikowano 20 Lipca 2011 Opublikowano 20 Lipca 2011 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.
Will Opublikowano 20 Lipca 2011 Opublikowano 20 Lipca 2011 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.
Rudy Opublikowano 20 Lipca 2011 Autor Opublikowano 20 Lipca 2011 @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.
Will Opublikowano 20 Lipca 2011 Opublikowano 20 Lipca 2011 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.
Rudy Opublikowano 20 Lipca 2011 Autor Opublikowano 20 Lipca 2011 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 ;) .
Rekomendowane odpowiedzi