公共运算符新建,私有运算符删除:使用 new 时出现 C2248“无法访问私有成员”
-
10-07-2019 - |
题
类具有重载运算符 new
和 delete
. new
是公开的, delete
是私人的。
在构造此类的实例时,出现以下错误:
pFoo = new Foo(bar)
示例.cpp(1):错误C2248:'Foo:运算符删除':无法访问类“Foo”中声明的私有成员
但没有人打电话给 delete
那么,编译器扭曲的头脑中到底发生了什么?:)
- 错误的原因是什么?
- 是否可以在不求助会员的情况下解决问题
CreateInstance
功能?
解决方案
当你这样做时 new Foo()
然后发生两件事:第一的 operator new
调用分配内存,然后构造函数 Foo
叫做。如果该构造函数抛出异常,由于您无法访问已分配的内存,C++ 运行时将通过将其传递给适当的内存来处理它。 operator delete
. 。这就是为什么你总是必须实现匹配 operator delete
对于每一个 operator new
你写的,这就是为什么它需要易于访问。
作为一种出路,你可以将它们都设为私有并调用 operator new
来自公共成员函数(例如 create()
).
其他提示
查看 这. 。在下面的一段中,它说 new 需要删除才能访问。基本上它说,你只能在堆上创建对象,如果你也可以再次删除它们。
根据 C++ 标准,当您的类具有动态内存分配并且构造函数内引发异常时,必须释放内存以避免内存泄漏。
在这里,您将自己的 new 运算符定义为 public ,但删除是 private 。
所以编译器是在告诉你,给我删除操作符的访问权限,这样我就可以 防止在构造函数中出现异常时内存泄漏。
如果您没有定义删除运算符,那么编译器也会给出错误并强制您定义它。
“1.错误原因是什么?”
履行机构的答复很好。
“2.是否可以不借助成员CreateInstance函数来解决问题?”
是的。创建私有析构函数。
如果类构造函数抛出异常,则在类上调用运算符 new 还将使用删除类。
如果您的库不使用异常,您可以从编译器“-fno-exceptions”禁用异常,然后错误将不再出现。(在 Visual Studio 中,位于“C/C++”、“代码生成”、“启用 C++ 异常”>“否(-fno-例外)”下)