Открытый оператор new, частный оператор delete: получение C2248 «не может получить доступ к частному члену» при использовании new - PullRequest
19 голосов
/ 30 ноября 2009

В классе перегружены операторы new и delete. new публично, delete приватно.

При создании экземпляра этого класса я получаю следующую ошибку:

pFoo = new Foo(bar)

example.cpp (1): ошибка C2248: «Foo: оператор delete»: невозможно получить доступ к закрытому члену, объявленному в классе «Foo»

Но здесь нет вызова delete, так что же происходит в запутанном уме компилятора? :)

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

Ответы [ 5 ]

27 голосов
/ 30 ноября 2009

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

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

3 голосов
/ 30 ноября 2009

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

2 голосов
/ 30 ноября 2009

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

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

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

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

1 голос
/ 30 ноября 2009
  • "1.Что является причиной ошибки?"

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

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

    Да. Создать приватный деструктор.

0 голосов
/ 17 июня 2019

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

Если ваша библиотека не использует исключения, вы можете отключить исключения из компилятора "-fno-exceptions", тогда ошибка больше не будет появляться. (В Visual studio находится в разделах «C / C ++», «Генерация кода», «Включить исключения C ++»> «Нет (-fno-exceptions)»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...