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

Niepoprawne inicjowanie zmiennych referencyjnych

Ostatnio zmodyfikowano 2015-04-15 13:07
Autor Wiadomość
Ryuujin
Temat założony przez niniejszego użytkownika
Niepoprawne inicjowanie zmiennych referencyjnych
» 2015-04-15 10:30:39
Panowie informatycy, zastanawiam się nad użyciem takiej konstrukcji:

class obj
{
    protected:
    obj **Point; //Pointer to pointer where object is handled
    obj * &Ref; //Reference to that pointer

    public:
    obj()
    :Point(0),
    Ref(*Point)
    {}
};

I szczerze mówiąc pisząc ją byłem święcie przekonany, że wywoła krzaka wraz z linijką "Ref(*Point)"... ale, o dziwo, nie robi tego!
Przynajmniej tak długo jak nie spróbuję w jakikolwiek sposób operować na Ref.

I teraz pytanie do ludzi ogarniętych w parserze i asemblerze gcc; jak bardzo złe byłoby wykorzystanie tego zjawiska w swoim programie?
Czy to działa zwyczajnie w ten sposób, że parser mi upraszcza linię "Ref(*Point)" z (jak oczekiwałem):
  1) Wyłuskaj Point <-- oczekiwany crash
  2) Zaalokuj Ref
  3) Nadpisz &Ref = &Wyłuskany_Point
Na:
  1) Zaalokuj Ref
  2) Nadpisz &Ref = Point ?
Czy może to jedynie zależne od procesora?

I wiem o możliwych konsekwencjach przy zwalnianiu zasobów, ale.. szczerze; i don't care. Przy kończeniu pracy serwer może się mi zwieszać - nie planuję go wyłączać.


Bardzo dziękuję za wszelką pomoc.
P-130911
Monika90
» 2015-04-15 12:53:47
Zachowanie programu jest niezdefiniowane. W typowej implementacji referencja będzie reprezentowana przez wskaźnik, więc wartość składowej Point (czyli NULL) będzie zwyczajnie skopiowana do Ref, dlatego nie widać żadnych szkodliwych skutków (na razie nie widać!). Ale formalnie zachowanie jest niezdefiniowane i nie ma żadnego powodu aby pisać taki kod. Po co Ci to jest potrzebne?
P-130912
Ryuujin
Temat założony przez niniejszego użytkownika
» 2015-04-15 13:07:05
No i o to chodziło. Dziękuję bardzo :3

Ano chciałem użyć zmiennej referencyjnej dla wygody (zawsze lepiej niż wskaźnik na wskaźnik, nie?). Później stwierdziłem, że mam problem z domyślnym konstruktorem i.. no jakoś temat mnie zaciekawiło - fajnie się przecież się dowiedzieć i poeksperymentować ^ ^

Chciałem wykorzystywać this, ale ono jest stałe i do referencji się nie daje.. dalej bawiłem się z przypisywaniem a później ku zaskoczeniu powyższy przykład się skompilował i poprawnie działał :3

Gdyby tylko ta jedna linia gwarantowała brak crasha - dalej bym spokojnie sobie poradził, bo metody mogące się odwołać do niej mogą być wywoływane tylko po konstruktorze z argumentem, np:

obj(obj **Arg)
:ref(*Arg)
{}

Więc byłoby w porządku.


W każdym razie dziękuję ^.=.^
P-130913
« 1 »
  Strona 1 z 1