静态对象的私有析构函数是如何调用的? [复制]

2023-11-27

可能的重复:
无法访问单例类析构函数中的私有成员

我正在实现一个单例,如下所示。

class A
{
public:

    static A& instance();
private:
    A(void)
    {
        cout << "In the constructor" << endl;
    }
    ~A(void)
    {
        cout << "In the destructor" << endl;
    }

};

A& A::instance()
{
    static A theMainInstance;
    return theMainInstance;
}

int main()
{
    A& a = A::instance();

    return 0;
 }

The 析构函数是私有的。当程序即将终止时,是否会为对象 theMainInstance 调用此函数?

我在 Visual Studio 6 中尝试了这个,它给出了编译错误。

"cannot access private member declared in class..."

在 Visual Studio 2010 中,它被编译并且析构函数被调用.

根据标准,这里的期望应该是什么?

编辑:由于 Visual Studio 6 的行为并不那么愚蠢,因此出现了混乱。可以说,静态对象 A 的构造函数是在 A 的函数上下文中调用的。但是析构函数未在同一函数的上下文中调用。这是从全局上下文中调用的。


C++03 标准的 3.6.3.2 节说:

Destructors for initialized objects of static storage duration (declared at block scope or at namespace scope) are called as a result of returning from main and as a result of calling exit.

它没有对私有析构函数给出任何限制,所以基本上,如果它被创建,它也会被销毁。

私有析构函数确实会限制声明对象的能力 (C++03 12.4.10)

A program is ill-formed if an object of class type or array thereof is declared and the destructor for the class is not accessible at the point of declaration

但由于 A::theMainInstance 的析构函数在声明时可以访问,因此您的示例应该没有错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态对象的私有析构函数是如何调用的? [复制] 的相关文章

随机推荐

  • Pandas 合并意外产生后缀

    我正在将两个 Pandas DataFrame 合并在一起 并获得 x 和 y 后缀 易于复制下面的示例 我尝试添加 suffixes False False 进入合并 但它返回一个错误 ValueError columns overlap
  • 通过 iframe 脚本加载器避免全局变量污染?

    问题 存在需要包含在网页上的编码不良的脚本 这些脚本通过执行以下操作来污染全局范围 为未声明的标识符赋值 向内置构造函数添加属性 例如Object and Array 及其原型 其他讨厌的东西 解决方案 我想包含脚本而不产生不利的副作用 我
  • C++ 中的 throw 后会调用析构函数吗?

    我运行了一个示例程序 确实调用了堆栈分配对象的析构函数 但这是否由标准保证 是的 这是有保证的 只要捕获到异常 直到命令其中调用析构函数 C 11 15 2 构造函数和析构函数 except ctor 1 当控制权从 throw 表达式传递
  • Stargazer 中的 p 值不精确

    我希望观星者的回归输出中的星星与 正常输出 中的星星相同 我产生数据 library stargazer library lmtest library sandwich set seed 1234 df lt data frame y 10
  • Visual Studio 在调试时锁定文件

    我有一个包含多个项目的 VS 解决方案 在调试特定项目时 VS 会锁定所有源文件 我想解锁调试者不依赖的源 有没有办法在一个解决方案中做到这一点 UPDATE 我使用的是 Win XP SP3 32 位 Visual Studio 2010
  • 为什么 $hash.key 语法在 ExpandString 方法中不起作用?

    以下 Powershell 脚本演示了该问题 hash a 1 b 2 Write Host hash a gt 1 Write Host hash a gt 1 Two ways of printing using quoted stri
  • 在打字稿函数中声明“this”的类型?

    我正在写一个繁重任务在打字稿中 我正在尝试翻译 JavaScript 中已有的内容 因此 当 grunt 运行一个任务时 它会运行一个函数 当它运行时 grunt 设置this具有有用属性的对象 与 jQuery 重载的方式相同this与您
  • 在分配控制台之前调用 Console.WriteLine

    我最近在我的应用程序中遇到了以下问题 它没有显示任何控制台输出 尽管控制台已通过使用分配AllocConsole 我很快就发现这是由于尝试 隐藏在代码中 在执行之前写入控制台而引起的 AllocConsole被称为 所以它看起来像这样 Co
  • 如何开发人脸识别iPhone应用程序? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试开发一款用于人脸识别 检测的 iPhone 在我的应用程序中 我想让我的 iP
  • 快速按下 Xcode 按钮时快速播放声音的最佳方法是什么?

    我有一个音板 它只是一个带有大约 8 个按钮的屏幕 每个单独的按钮都有自己的声音 按下按钮时会播放该声音 我可以通过多种方式播放声音 例如使用 SystemSound 或 AVAudioPlayer 到目前为止 系统声音似乎具有最快的响应时
  • MPI:阻塞与非阻塞

    我无法理解 MPI 中阻塞通信和非阻塞通信的概念 两者有何区别 有什么优点和缺点 阻止通信是使用完成的MPI Send and MPI Recv 在通信完成之前 这些函数不会返回 即 它们会阻塞 稍微简化一下 这意味着缓冲区传递给MPI S
  • 免受自由的保护

    刚刚在我们的应用程序上尝试了 Freedom 应用程序 我可以用它购买所有应用程序内购买项目 至少在运行 Play Store 3 x 时是这样 如果我将 Play 商店升级到 4 x 那么 Freedom hack 就会停止工作 无论如何
  • 在对象上调用 getter 与将其存储为局部变量(内存占用、性能)

    在下面的代码中我们进行调用listType getDescription twice for ListType listType this listTypeManager getSelectableListTypes if listType
  • spring-boot + tomcat RewriteValve

    是否可以以某种方式自定义嵌入式 tomcat重写阀 正如我所看到的api目前只有以下方法添加上下文阀 and 添加发动机阀门但正如 Tomcat 在文档中指出的那样 RewriteValve 应该放置在 Host 中或 web 应用程序的
  • Python 中确定特定函数是否在堆栈上的有效方法

    对于调试来说 判断特定函数是否位于调用堆栈的较高位置通常很有用 例如 我们通常只想在某个函数调用我们时运行调试代码 一种解决方案是检查上方的所有堆栈条目 但如果这是在堆栈深处并重复调用的函数中 这会导致过多的开销 问题是找到一种方法 使我们
  • java在哪里寻找文件?

    我正在尝试用java读取文件 Public class Test public static void main String args throws IOException BufferedReader f new BufferedRea
  • 将 Nhibernate 查询转换为通用列表时出错

    我有一个简单的实体称为EmployeeEntity有属性ID Name Age Organisation and Designation 我只是使用查询来查询数据库 IQuery query session CreateQuery sele
  • 忽略 Powershell Invoke-RestMethod 中的自签名证书不起作用(又变了......)

    使用忽略证书验证的标准解决方案后 Invoke RestMethod正在返回 Invoke RestMethod A system error occurred and has been logged Please try again la
  • Matlab - 如何替换向量中的所有特殊字符?

    是否可以通过正则表达式替换matlab向量中的所有特殊字符 谢谢 EDIT 谢谢你的回复 我正在努力实现以下目标 我有一个文本文件 其中包含小说中的几个段落 我已将此文件读入向量 fileText Token1 token 2 token
  • 静态对象的私有析构函数是如何调用的? [复制]

    这个问题在这里已经有答案了 可能的重复 无法访问单例类析构函数中的私有成员 我正在实现一个单例 如下所示 class A public static A instance private A void cout lt lt In the c