Общедоступный оператор новый, частный оператор удаляет: получение C2248 “не может получить доступ к члену парламента, не занимающему официального поста” при использовании новый

Java передает параметры по значению. В Java нет возможности передать ссылку.

Но на уровне уровня привязки компилятора он использует ссылку, внутренне не предоставленную пользователю.

Это важно, так как экономит много памяти и улучшает скорость.

19
задан MaxVT 30 November 2009 в 14:12
поделиться

4 ответа

Когда вы выполняете new Foo () , происходят две вещи: сначала вызывается оператор new для выделения памяти, а затем конструктор для Вызывается Foo . Если этот конструктор вызывает ошибку, поскольку вы не можете получить доступ к уже выделенной памяти, среда выполнения C ++ позаботится об этом, передав ее соответствующему оператору delete . Вот почему вы всегда должны реализовывать соответствующий оператор delete для каждого оператора new , который вы пишете, и поэтому он должен быть доступен.

В качестве выхода вы можете сделать их оба закрытыми и вызывать оператор new из общедоступной функции-члена (например, create () ).

27
ответ дан 30 November 2019 в 03:53
поделиться

Проверьте this . В одном из нижних абзацев сказано, что new требует, чтобы удалить было доступно. По сути, он говорит, что вы можете создавать объекты только в куче, если вы также можете удалить их снова.

3
ответ дан 30 November 2019 в 03:53
поделиться

В соответствии со стандартами C ++, если у вас есть класс с динамическим распределением памяти и внутри конструктора возникает исключение, память должна быть освобождена, чтобы избежать утечек памяти.

Здесь вы определили у вас есть новый оператор как общедоступный, но удаление является частным.

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

Если вы не определите оператор удаления, компилятор также выдаст ошибку и заставит вас определить ее.

2
ответ дан 30 November 2019 в 03:53
поделиться
  • «1. Какова причина ошибки?»

    ответ sbi хорош.

  • «2. Можно ли решить проблему, не прибегая к функции члена CreateInstance ? "

    Да. Создайте частный деструктор.

1
ответ дан 30 November 2019 в 03:53
поделиться
Другие вопросы по тегам:

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