если (! это) {возвращают false;}

Это довольно близко к ISO 8601, так что давайте начнем с этого.

const d = new Date();
d
  .toISOString() // Convert date to a string in the format of 2019-03-25T00:07:22.0253Z
  .substr(0, 19)  // Strip off the milliseconds and Zulu timezone indication
  .replace('T', ' '); // Replace the T for "time" with a space

Это оставляет вас с датой, отформатированной как 2019-03-25 00:07:22.

10
задан chown 18 November 2011 в 00:48
поделиться

7 ответов

Если Вы имеете:

MyObject *o = NULL;

o->func();

Что происходит, затем зависит от ли func является виртуальным. Если это будет, то это откажет, потому что этому нужен объект получить vtable от. Но если это не является виртуальным доходы вызова с этим установленным в NULL указателем.

Я полагаю, что в стандарте говорится, что это - "неопределенное поведение", таким образом, что-либо могло произойти, но типичные компиляторы просто генерируют код, чтобы не проверить, является ли указатель НУЛЕВЫМ. Некоторые известные библиотеки полагаются на поведение, которое я описал: MFC назвали функцию что-то как SafeGetHandle это можно назвать на нулевом указателе и возвращает ПУСТОЙ УКАЗАТЕЛЬ в этом случае.

Вы могли бы хотеть записать допускающую повторное использование функцию помощника:

void CheckNotNull(void *p)
{
    if (p == NULL)
        throw NullPointerException();
}

Можно затем использовать это в начале функции для проверки всех ее аргументов, включая this:

CheckNotNull(this);
22
ответ дан 3 December 2019 в 16:10
поделиться

Способ захватить подобные ошибки (дизайном) использует класс обертки указателя (напоминающий a shared_ptr) это бросает после создания с аргументом нулевого указателя. Это может бросить также при разыменовании, но это немного поздно - лучше чем ничего, я предполагаю.

2
ответ дан 3 December 2019 в 16:10
поделиться

Это возможно для this быть пустым. Я подозреваю, что этот код пытается (плохо) обнаружить состояние состязания, где объект еще не закончен, будучи инициализированным или был удален.

1
ответ дан 3 December 2019 в 16:10
поделиться

(это == ПУСТОЙ УКАЗАТЕЛЬ), неопределенное поведение согласно стандарту. Я думаю, что необходимо удалить эту проверку :)

Предположите, что мы выполняем следующий вызов:

((CSomeClass*) 0)->method();

Поведение уже не определено, итак, почему беспокойство, делающее проверку на это == ПУСТОЙ УКАЗАТЕЛЬ в CSomeClass:: метод?

ОТРЕДАКТИРОВАННЫЙ: Я Предполагаю, что Ваш компилятор обработает (0 == это), если Вы не будете использовать членские переменные, но где он нашел бы виртуальный указатель таблицы? В этом случае Ваш класс не может использовать полиморфизм.

1
ответ дан 3 December 2019 в 16:10
поделиться
if(this == null)
   throw new NullPointerException;
if(!this)
   return false;
1
ответ дан 3 December 2019 в 16:10
поделиться

этот указатель может стать пустым в случаях как они:

class Test
{

public:
    bool f();

private:
    int m_i;
};


bool Test::f()
{
    if(!this)
    {
        return false;
    }

    m_i = 0;
    return true;

}


int main(int argc, char **argv)
{
    Test* p = new Test;
    delete p;
    p = NULL;

    p->f();
}

Я предполагаю, что кто-то сделал быстрый взлом для предотвращения к исключению нарушения прав доступа.

0
ответ дан 3 December 2019 в 16:10
поделиться

это == пустой указатель должен только произойти при вызове метода на удаленном объекте, или если что-то пишет в память, что это не должно (и перезапись этого указателя объекта в особенности).

Необходимо исследовать то, что является действительно неправильным с кодом вместо того, чтобы пытаться работать вокруг этого как это.

-1
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

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