公共运算符新建,私有运算符删除:使用 new 时出现 C2248“无法访问私有成员”

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

类具有重载运算符 newdelete. new 是公开的, delete 是私人的。

在构造此类的实例时,出现以下错误:

pFoo = new Foo(bar)

示例.cpp(1):错误C2248:'Foo:运算符删除':无法访问类“Foo”中声明的私有成员

但没有人打电话给 delete 那么,编译器扭曲的头脑中到底发生了什么?:)

  1. 错误的原因是什么?
  2. 是否可以在不求助会员的情况下解决问题 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-例外)”下)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top