Niepoprawne inicjowanie zmiennych referencyjnych
Ostatnio zmodyfikowano 2015-04-15 13:07
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. |
|
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? |
|
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ę ^.=.^ |
|
« 1 » |