Несмотря на то, что можно получить физический адрес объекта пространства ядра и отправить его в пространство пользователя, он не может получить доступ к пространству ядра из пространства пользователя, иначе любая вредоносная программа получит полный доступ для чтения любых структур ядра.
Вы не проверяли возвращаемое значение mmap()
для значения MAP_FAILED
((void *) -1
), а затем пытались получить доступ к этому недействительному адресу памяти.
Объявление неявно объявленного конструктора копирования фактически не подавляется. Это просто не вызывается из-за правил разрешения перегрузки.
Неявно объявленный конструктор копирования имеет форму Foo(const Foo&)
. Важной частью этого является то, что требуется постоянная ссылка. Ваш шаблон конструктора использует неконстантную ссылку.
a
не является константой, поэтому неконстантный объявленный пользователем шаблон конструктора предпочтительнее неявно объявленного конструктора копирования. Чтобы вызвать неявно объявленный конструктор копирования, вы можете сделать a
const:
const Foo a;
Foo b(a);
или использовать static_cast
для получения константной ссылки на a
:
Foo a;
Foo b(static_cast<const Foo&>(a));
Правила разрешения перегрузки, описывающие это, находятся в основном в §13.3.3.2 / 3 FCD C ++ 0x. Этот конкретный сценарий, с комбинацией ссылок lvalue и rvalue, как бы описан различными примерами на стр. 303.
Шаблон конструктора переменных будет подавлять неявно объявленный конструктор по умолчанию, так как шаблон конструктора переменных объявлен пользователем, а неявно объявленный конструктор по умолчанию предоставляется только в том случае, если нет конструкторов, объявленных пользователем (C ++ 0x FCD § 12.1 / 5):
Если для класса
X
нет объявленного пользователем конструктора, конструктор, не имеющий параметров, неявно объявляется как дефолтный.
Шаблон конструктора с переменными параметрами не будет подавлять неявно объявленный конструктор копирования, поскольку только конструктор без шаблона может быть конструктором копирования (C ++ 0x FCD §12.8 / 2, 3 и 8):
Не шаблонный конструктор для класса
X
является конструктором копирования, если его первый параметр имеет типX&
,const X&
,volatile X&
илиconst volatile X&
, и либо нет других параметров или все остальные параметры имеют аргументы по умолчанию.Не шаблонный конструктор для класса
X
является конструктором перемещения, если его первый параметр имеет типX&&
,const X&&
,volatile X&&
илиconst volatile X&&
, и либо нет других параметров, либо все остальные параметры имеют аргументы по умолчанию.Если определение класса явно не объявляет конструктор копирования, и не существует объявленного пользователем конструктора перемещения, конструктор копирования неявно объявляется как дефолтный.