Подтвердить что ты не робот

Открытый оператор new, частный оператор delete: получение C2248 "не может получить доступ к частному пользователю" при использовании нового

Класс имеет перегруженные операторы new и delete. new является общедоступным, delete является закрытым.

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

pFoo = new Foo(bar)

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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