C ++ - приведение пустого указателя - PullRequest
1 голос
/ 09 апреля 2011

Выдает ли C ++ исключения времени выполнения, когда вы пытаетесь привести void* к чему-то, что не является?

class Sheep
{
public:
    Sheep() { }

    ~Sheep() { }

    void Bah()
    {
        // Print Bah!
    }
};

class Unicorn
{
    Unicorn() { }

    ~Unicorn() { }

    void Stab(Sheep* s)
    {
        s->Bah();
    }
};


int main()
{
    Sheep sheep;

    void* ptr = (void*) &s;

    // I'm guessing this would be 'valid'
    Unicorn* unicorn = (Unicorn*) ptr;
    // This must go wrong..?
    unicorn->Stab(&sheep);

    return 0;
} 

Ответы [ 4 ]

8 голосов
/ 09 апреля 2011

Выдает ли C ++ исключения времени выполнения, когда вы пытаетесь привести void* к чему-то, что не является?

Нет, это не так.

Поведение вашей программы не определено: все может произойти. Может показаться, что программа работает большую часть времени, может произойти сбой в любой момент или может произойти что-то худшее.

void* следует избегать во всех, кроме нескольких редких случаев в C ++; вместо того, чтобы использовать void*, вам следует рассмотреть возможность использования наследования классов, полиморфизма или шаблонов, чтобы быть уверенным, что ваш код безопасен по типу. Хотя C ++ позволяет вам писать код, который не является безопасным с точки зрения типов, он также предоставляет множество инструментов, которые помогают вам писать код с безопасным типом и делают этот код намного более простым, простым и корректным.

2 голосов
/ 09 апреля 2011

Нет.Если бы вы не могли разыграть пустоту *.что ты мог с этим сделать !?Фактически вы должны привести его к типу, чтобы присвоить его указателю другого типа или разыменовать его.

В вашем примере вы использовали приведение в стиле C, C ++ поддерживает несколько более безопасных операторов преобразованиянапример, dynamic_cast, который делает , проверяет достоверность приведения во время выполнения.

0 голосов
/ 09 апреля 2011

Нет. или в C или в C ++ это основная операция, которую мы можем выполнить на этом языке.

0 голосов
/ 09 апреля 2011

Нет, это не так.Вот почему использование void* в C ++ - плохая практика.

Используйте шаблоны вместо void*.они безопасны по типу.

void* следует использовать только тогда, когда вы имеете дело с кодом C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...