Java передает параметры по значению. В Java нет возможности передать ссылку.
Но на уровне уровня привязки компилятора он использует ссылку, внутренне не предоставленную пользователю.
Это важно, так как экономит много памяти и улучшает скорость.
Когда вы выполняете new Foo ()
, происходят две вещи: сначала вызывается оператор new
для выделения памяти, а затем конструктор для Вызывается Foo
. Если этот конструктор вызывает ошибку, поскольку вы не можете получить доступ к уже выделенной памяти, среда выполнения C ++ позаботится об этом, передав ее соответствующему оператору delete
. Вот почему вы всегда должны реализовывать соответствующий оператор delete
для каждого оператора new
, который вы пишете, и поэтому он должен быть доступен.
В качестве выхода вы можете сделать их оба закрытыми и вызывать оператор new
из общедоступной функции-члена (например, create ()
).
Проверьте this . В одном из нижних абзацев сказано, что new требует, чтобы удалить было доступно. По сути, он говорит, что вы можете создавать объекты только в куче, если вы также можете удалить их снова.
В соответствии со стандартами C ++, если у вас есть класс с динамическим распределением памяти и внутри конструктора возникает исключение, память должна быть освобождена, чтобы избежать утечек памяти.
Здесь вы определили у вас есть новый оператор как общедоступный, но удаление является частным.
Итак, компилятор сообщает вам, что предоставьте мне доступ к оператору удаления, чтобы я мог предотвратить утечку памяти, если в конструкторе возникнет какое-либо исключение.
Если вы не определите оператор удаления, компилятор также выдаст ошибку и заставит вас определить ее.
«1. Какова причина ошибки?»
ответ sbi хорош.
«2. Можно ли решить проблему, не прибегая к функции члена CreateInstance ? "
Да. Создайте частный деструктор.