передавая NULL в качестве аргумента в функции

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

private:
Book (string N = " ", int p = 100, string A = "",
string P = "", string T = "", int Y = 2000)
{
cout << "Book constructor start " << N << endl;
Title=N;
pages=p;
Author=A;
Publisher=P;
Type=T;
Yearpublished=Y;
}

~Book(void)
{
cout << "Book destructor start " << Title << endl;
system("pause");
}

public:
static Book * MakeBook(string N = "", int p = 100, string A = "",
string P = "",string T = "",int Y = 2000)
{
return new Book(N,p,A,P,T,Y);
}

static void DelBook(Book * X) {
delete X;
}

В приведенном выше коде конструктор и деструктор, мой вопрос, что происходит, когда я передаю NULL в качестве аргумента в stactic void DelBook функционировать? как это ниже

static void DelBook(NULL)
{
delete NULL;
}

Как я могу заставить его скомпилировать, если возможно передать значение NULL? Заранее спасибо.

4

Решение

Пока DelBook только вызывает delete — ничего не происходит, это неоперация. (и можно вызвать DelBook с NULL в качестве значения параметра не требуется никаких дополнительных действий).

4

Другие решения

NULL является допустимым указателем: он указывает на нулевую ячейку памяти. Поэтому вы можете передать NULL в функцию, которая принимает Book* указатель, потому что это Book* указатель.

Кроме того, NULL является особенным и не должен быть приведен к Book* — тебе не нужно говорить DelBook((Book*)NULL), Поэтому программа должна уже скомпилироваться.

Удаление нулевого указателя ничего не делает, поэтому вам не нужна проверка работоспособности. Однако, если вам нужно что-то сделать с членом Book класс, вы должны проверить, что это не NULL в первую очередь:

static void DelBook(Book * X)
{
if (X){
x->tidyUpBeforeDeletion();
delete X;
}
}

Невозможность проверить это приведет к segfault — это разыменование нулевого указателя и это очень плохие новости.

0

Прохождение NULL само по себе обычно не является проблемой. Это в основном 0. Удаление NULL, вероятно, не имеет никакого эффекта

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector