Новый государственный оператор, удаление частного оператора:получение C2248 «невозможно получить доступ к частному члену» при использовании нового

StackOverflow https://stackoverflow.com/questions/1820069

Вопрос

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

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

pFoo = new Foo(bar)

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

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

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

Решение

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

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

Другие советы

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

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

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

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

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

  • «1.В чем причина ошибки?»

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top