(C++) Нулевой указатель на объект

Тема в разделе "LANGS.C", создана пользователем Asvald, 24 фев 2007.

Статус темы:
Закрыта.
  1. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    У меня в Visual C++ 6.0 прекрасно работает следующий код:
    Код (Text):
    1. class CT
    2. {
    3. public:
    4.     int m_h;
    5.     void F1() {cout<<"CT::F1"<<endl; }
    6. };
    7.  
    8. int  main()
    9. {
    10.     CT* p=0;
    11.     (*p).F1();   //На консоль выводится CT::F1
    12.     //CT::F1(); //а тут ошибка, хотя по сути это одно и тоже, но это для static функций
    13.    
    14.     return 0;
    15. }
    Это работет во всех компиляторах?
    Я так понимаю, что при вызове не виртуальной функции класса через указатель на этот класс не важно на какой объект фактически указывает указатель.
     
  2. HoBleen

    HoBleen New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    77
    В отладочной версии компилятор может вставлять в начале каждой функции AssertValid(), тогда обязательно будет осуществлена проверка указателя.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    По идее, вызов метода класса - тоже самое, что вызов обычной функции, только первым параметром идет указатель на объект. Все должно быть нормально вроде бы, если метод не обращается к полям объекта.

    На вопрос, везде ли работает - вот для G++:

     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    народ, у кого gcc последний..
    что будет на экране?
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. main()
    4. {
    5.     printf("??!");
    6. }
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Nouzui
    http://en.wikipedia.org/wiki/C_trigraph

    Правда, я не знал, что в строках они тоже действительны, хотя это и логично.
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    IceStudent, Nouzui, как я понял, спрашивает про последнюю версию.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    чето вы не в тему немного пошли (:
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Nouzui
    у меня последний gcc.
    Лог:
    Он игнорит, как видно, но все же выдает ворнинг )
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    поняятно... по крайней мере, понимает )
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Nouzui
    а к чему ты спросил? не в тему же совсем ))
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ну не создавать же теперь отдельную тему из-за этого!
    а с первым вопросом, по-моему, все понятно: при вызове не виртуальной функции указатель используется только в качестве параметра. То есть, будет работать, а помешать может разве что автоматическая генерация проверяющего кода (как HoBleenнаписал). Про студию и gcc уже известно.. осталось только про билдер узнать.. ))
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Гарантирует ли стандарт нормальную работу методов, вызванных по бэд поинтеру, но не обращающихся к своим, простите, членам?

    Я так понимаю что вызов виртуальной функции по бэд поинтеру сразу же грохнеццо.
     
  13. BreakPointMAN

    BreakPointMAN New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    42
    Адрес:
    Russia
    Разыменование нулевого указателя по Стандарту приводит к UB.
     
  14. BreakPointMAN

    BreakPointMAN New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    42
    Адрес:
    Russia
    PS: кстати, прикол по поводу сабжа... Заходим на Яndex и вводим в качестве запроса (без кавычек!): "+разыменование +(нулевого|NULL) +указателя"... и любуемся результатом.
     
  15. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    К слову , я разбираюсь с технологией COM по книжке Inside COM, поэтому и провожу различные эксперименты с классами, их виртуальными и не виртуальными функциями-членами и указателями, а потом смотрю генерируемый компилятором асм листинг и попутно открываю для себя некоторые вещи, так, например, во всех книгах по си++ пишут типа, что при определении класса память не выделяется, и поэтому я думал что таблицы виртуальных функций создаются для объектов класса в рантайме, а оказалось, что они создаются при определении класса в статической памяти (то есть память при определении все таки выделяется), а потом в конструкторе класса в первый dword каждого объекта пишется указатель на эту таблицу.
    Возможно, я изобретаю велосипед, но для интуитивного понимания, я думаю, полезно.
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Буду новичков на работе пугать, вставляя подобный код )))
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Формально, а также в общем случае, память под классы не выделяется. Для реализации виртуальных функций же есть "накладные расходы": по vtable на каждый класс, содержащий виртуальные функции, и по указателю на каждый объект таких классов. Не нашёл, где об этом говорится в стандарте, но Страуструп упоминает это.

    Но эти расходы возникают только в случае определения хотя бы одного такого объекта.
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EvilsInterrupt
    Тогда уж пугать вызовом функций класса, объект которого в нулевом указателе. Правда, могут тоже научиться этому, потом не выведешь такую практику.
     
  19. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    пардон за оффтоп, но я все же решусь здесь это спросить. я уже много раз об этом подумывал, но все не отваживался предложить эту идею здесь. ладно, рискну.

    уважаемые форумчане (особенно модераторы), не считаете ли вы нужным создать подфорум, посвященный языкам C/C++ ? а то ведь столько тем понаплодилось, связанных с этими языками, и им приходится простаивать в WASM.HEAP.
    я конечно понимаю, что WASM в первую очередь посвящен низкоуровневому программированию, но ввиду такого большого кол-ва топиков, связанных с С/С++ (особливо с последним), а также с учетом популярности и заслуженного статуса языков C/С++, я думаю, это было бы очень супер! а так, приходится бегать на др. сайты, чтобы просвещаться насчет С/C++.

    или же завести просто тему а-ля: "вопросы по С/C++ постим сюда" (в духе того же "Студентам с вопросами о лабораторных работах сюда").

    очень бы хотел услышать ваши мнения на этот счет. желательно обойтись без пинков%)
     
  20. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    В принципе, по современным меркам семейство C считается инструментом низкоуровневого/системного программирования, так что я, в принципе, не против, хотя это и требует некоторого уточнения доктрины сайта.
     
Статус темы:
Закрыта.