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

co robi ten for?

Ostatnio zmodyfikowano 2016-05-04 22:28
Autor Wiadomość
pekfos
» 2016-05-04 19:24:29
Prawdopodobieństwo, że u skibixd new zwróci adres 0x0 jest praktycznie równe zero.
new wyrzuci std::bad_alloc, a nie zwróci zero.

Na dodatek większość nowoczesnych kompilatorów zachowuje się mądrzej niż definiuje to standard i program powinien zachować się tak jak intuicja podpowiada.
To dalej dokładnie według standardu.
P-147933
Phestek
» 2016-05-04 19:52:25
Ja jeszcze dodam od siebie, że nagie wskaźniki nie są dobrą opcją w C++. Zamiast nich używaj smart pointerów.
P-147937
j23
» 2016-05-04 19:58:30
@pekfos, new wyrzuci std::bad_alloc jeśli alokacja się nie powiedzie. A mi chodziło o przypadek, kiedy new zwróciłoby poprawną pamięć zaczynającą się od adresu 0x0. Na platformach takich jak Windows czy Linux (x86) to niemożliwe.
P-147939
pekfos
» 2016-05-04 22:22:34
Nie zwróci. Adres 0 to wskaźnik pusty. Dereferencja takiego adresu ma niezdefiniowane zachowanie, przekazanie go do delete nie wywołuje usuwania. Dodatkowo ta wartość jest używana w funkcjach alokujących do sygnalizacji błędu (np w nothrow new). Poza tym, jaka architektura? (Te bardziej egzotyczne to państwa w państwie, ich kompilatory nie trzymają się zbytnio standardów C/C++) Zwykle adresy od zera w górę są zarezerwowane na użytek sprzętu i kod wykonywany zaraz po starcie maszyny. Są architektury z oddzielnie adresowaną pamięcią na dane, ale do tego musiałaby być odpowiednio zaimplementowana dynamiczna alokacja (bo tego w zestawie już nie będzie) - tak by niższe adresy nie były na nic na stałe wykorzystane, oraz zwracany przez alokację adres faktycznie odpowiadał początkowi rezerwowanego bloku (nie: alokowanego bloku). Wątpię, że znajdziesz coś takiego w jakimkolwiek współcześnie spotykanym układzie, czy nawet w jakimkolwiek układzie w ogóle. W skrócie, to zbyt upierdliwe, by włączyć zero do puli poprawnych adresów, a 'zerowość' liczby to taka łatwa cecha do zidentyfikowania..
P-147954
Elaine
» 2016-05-04 22:28:14
A co tu jest nielegalnego?
5.7/5 (do którego ostatecznie 5.2.6/2 się odwołuje):
When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. […] If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.

Adres 0 to wskaźnik pusty.
Nie. Nie ma żadnej gwarancji, że reprezentacja pustego wskaźnika jest równa wskaźnikowi na adres 0. Istnieją architektury (dziś w większości raczej historyczne, ale wciąż), gdzie wskaźnik pusty nie jest reprezentowany zerami.
Zwykle adresy od zera w górę są zarezerwowane na użytek sprzętu i kod wykonywany zaraz po starcie maszyny
Nie. Zwykle adresy w okolicach zera nie są niczym specjalnym i mogą być użyte do czegokolwiek. System operacyjny może, ale nie musi, odmawiać zmapowania czegokolwiek w ten obszar. Linux, na przykład, pozwala użyć adresu 0 jako normalnego bloku danych, jeśli się go odpowiednio ładnie poprosi, z tego też powodu Linux jest kompilowany z opcją -fno-delete-null-pointer-checks, bo obiekty mogą tam istnieć, więc kompilator nie powinien zakładać, że obiektów tam nie ma.

To jest dość niefortunny z punktu widzenia standardu przykład, ponieważ ABI Linuksa definiuje pusty wskaźnik jako wskaźnik na adres 0*, a mimo tego mogą tam istnieć obiekty.

* lepszą definicją byłyby same jedynki? To przynajmniej wskazuje w przestrzeń adresową kernela, który może po prostu niczego tam nigdy nie mapować, a procesy trybu użytkownika mogą chcieć mapować coś pod same zera, na przykład warstwy kompatybilności z innymi systemami, które tego adresu używały do jakichś celów, z oczywistych powodów chcą, by pod adresem 0 była pamięć.
P-147955
1 « 2 »
Poprzednia strona Strona 2 z 2