Это довольно близко к 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
.
Если Вы имеете:
MyObject *o = NULL;
o->func();
Что происходит, затем зависит от ли func
является виртуальным. Если это будет, то это откажет, потому что этому нужен объект получить vtable от. Но если это не является виртуальным доходы вызова с этим установленным в NULL указателем.
Я полагаю, что в стандарте говорится, что это - "неопределенное поведение", таким образом, что-либо могло произойти, но типичные компиляторы просто генерируют код, чтобы не проверить, является ли указатель НУЛЕВЫМ. Некоторые известные библиотеки полагаются на поведение, которое я описал: MFC назвали функцию что-то как SafeGetHandle
это можно назвать на нулевом указателе и возвращает ПУСТОЙ УКАЗАТЕЛЬ в этом случае.
Вы могли бы хотеть записать допускающую повторное использование функцию помощника:
void CheckNotNull(void *p)
{
if (p == NULL)
throw NullPointerException();
}
Можно затем использовать это в начале функции для проверки всех ее аргументов, включая this
:
CheckNotNull(this);
Способ захватить подобные ошибки (дизайном) использует класс обертки указателя (напоминающий a shared_ptr
) это бросает после создания с аргументом нулевого указателя. Это может бросить также при разыменовании, но это немного поздно - лучше чем ничего, я предполагаю.
Это возможно для this
быть пустым. Я подозреваю, что этот код пытается (плохо) обнаружить состояние состязания, где объект еще не закончен, будучи инициализированным или был удален.
(это == ПУСТОЙ УКАЗАТЕЛЬ), неопределенное поведение согласно стандарту. Я думаю, что необходимо удалить эту проверку :)
Предположите, что мы выполняем следующий вызов:
((CSomeClass*) 0)->method();
Поведение уже не определено, итак, почему беспокойство, делающее проверку на это == ПУСТОЙ УКАЗАТЕЛЬ в CSomeClass:: метод?
ОТРЕДАКТИРОВАННЫЙ: Я Предполагаю, что Ваш компилятор обработает (0 == это), если Вы не будете использовать членские переменные, но где он нашел бы виртуальный указатель таблицы? В этом случае Ваш класс не может использовать полиморфизм.
if(this == null)
throw new NullPointerException;
if(!this)
return false;
этот указатель может стать пустым в случаях как они:
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();
}
Я предполагаю, что кто-то сделал быстрый взлом для предотвращения к исключению нарушения прав доступа.
это == пустой указатель должен только произойти при вызове метода на удаленном объекте, или если что-то пишет в память, что это не должно (и перезапись этого указателя объекта в особенности).
Необходимо исследовать то, что является действительно неправильным с кодом вместо того, чтобы пытаться работать вокруг этого как это.