Избегайте использования неопределенного объекта в C ++

Хотя void может стоять на месте для типа, он фактически не может удерживать значение. Поэтому он не имеет размера в памяти. Получение размера void не определено.

Указатель void - это просто языковая конструкция, означающая указатель на память untyped .

0
задан Ahrtaler 19 March 2019 в 09:26
поделиться

3 ответа

Тестирование в классе - неправильный способ, предупреждение о том, что если ваш код правильно определен, то this не должно быть нулевым, поэтому тест должен выполняться в тот момент, когда вы вызываете функцию-член: [ 117]

int main()
{
    ExampleClass* myClass = nullptr; // always initialize a raw pointer to ensure
                                     // that it does not point to a random address

    // ....    

    if (myClass != nullptr) {
      myClass->readSomeData(2.5);
    }

    return 0;
}

Если указатель не должен быть нулевым в определенной части вашего кода, вы должны сделать это в соответствии с CppCoreGuideline: I.12: Объявить указатель, который не должен быть нулевым, как not_null [115 ]

Micorosoft предоставляет библиотеку поддержки руководящих принципов , которая имеет реализацию для not_null.

Или, если возможно, тогда вообще не используйте указатели, кроме std::optional.

Таким образом, настройка кода может выглядеть следующим образом:

#include <gsl/gsl>

struct ExampleClass {
   void readSomeData(double ){}
};

// now it is clear that myClass must not and can not be null within work_with_class
// it still could hold an invalid pointe, but thats another problem
void work_with_class(gsl::not_null<ExampleClass*> myClass) {
  myClass->readSomeData(2.5);
}

int main()
{
    ExampleClass* myClass = nullptr; // always initialize a raw pointer to ensure
                                     // that it does not point to a random address

    // ....

    work_with_class(myClass);

    return 0;
}
0
ответ дан t.niese 19 March 2019 в 09:26
поделиться

Лучший способ не использовать указатели на все:

int main()
{
    ExampleClass myClass;
    myClass.readSomeData(2.5);
}

Таким образом, нет необходимости в какой-либо проверки, а на самом деле, проверка this внутри функции является спорным .

Если вам нужна обнуляемость, используйте вместо этого std::optional.

0
ответ дан Bartek Banachewicz 19 March 2019 в 09:26
поделиться

Либо не используйте указатели, как указал Bartek Banachewicz, либо правильно инициализируйте и проверьте указатель:

int main()
{
    ExampleClass* myClass= 0;

    if (myClass)
       myClass->readSomeData(2.5);

   return 0;
}

Конечно, вы все еще должны добавить создание объект в какой-то момент, в противном случае код является бессмысленным.

0
ответ дан user826955 19 March 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: