является ли данный код корректным

Тема в разделе "WASM.ZEN", создана пользователем alegordon, 12 окт 2006.

  1. alegordon

    alegordon New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    20
    №1.

    const void* f(const int& c) { return &c; }

    main
    {
    const void* p = f(4);
    const int* pi = (const int*)p;
    std::cout<<*pi;
    }

    №2.

    class cC
    {
    public: const char* pMsg;
    public: cC(const char* msg): pMsg(msg) { }
    };

    main
    {
    cC c("HELLo");
    std::cout<<c.pMsg;
    }

    Мне кажется Этот код неверен. хотя все работает стабильно!
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    1. теоретически 4 это непосредственно константа, не хранимая как данные, только используемая как immediate const в коде, но фактически и она имеет свой адрес, хотя никто так не делает, а зря;)
    2. вроде нормально.
     
  3. alegordon

    alegordon New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    20
    №2 есть пример в библиотеке с++. на примере exception. Вот. но не понятно тот факт что переменная "HELLo" является временной и хранится в стеке. по логике как только конструктор отработал ее теоретически нет. однако когда делаем throw exception("HELLo"); мы управление получаем в другой участок кода. и там к ней есть доступ!!??
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Это проинициализированная строка и соответственно она хранится в сегменте инициализированных данных.
     
  5. alegordon

    alegordon New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    20
    // проинициализированная строка
    что это значит, она хранится по особому. а кто ее удаляет? и как он знает когда ее удалять? ведь сборщика мусора неТТТ!
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    2 полностью корректен. Только вот public: public: явно от явы или шарпа :)
    1. константная ссылка.. Вообще, 4 - это rvalue и у неё адреса нет. Но С++ имеет возможность применения к выражению (rvalue) операции взятия адреса, т.е. "&e". В этом случае используется временный объект. То же самое и с константными ссылками: создаётся временный объект, но он не модифицируется, поэтому значение 4 может быть "временным объектом". С другой стороны, если ссылка была бы не константная, то ссылка на 4 не имела бы смысла, т.к. модифицировать нечего.
     
  7. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Да никто и не удаляет. Она находится в секции PE-файла, а во всех выражениях используется адрес этой строки. Если посмотреть экзешник в тесктовом редакторе, то эту строку можно легко найти. Или ты о другом?
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Тем не менее, из "другого участка кода", то есть из обработчика исключений, доступен контекст функции, вызвавшей исключение, соответственно, и есть доступ к стеку. А в нём твой cC.
     
  9. alegordon

    alegordon New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    20
    //Да никто и не удаляет. Она находится в секции PE-файла, а во всех выражениях
    //используется адрес этой строки. Если посмотреть экзешник в тесктовом редакторе, то эту
    //строку можно легко найти.

    Так может там и 4 валяется из 1го примера?
     
  10. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    С четырьмя все гораздо проще. Четверка является частью инструкции, immediate operand для команды "push 4"