Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果析构函数被调用两次,为什么我的程序不会崩溃_C++ - Fatal编程技术网

C++ 如果析构函数被调用两次,为什么我的程序不会崩溃

C++ 如果析构函数被调用两次,为什么我的程序不会崩溃,c++,C++,代码如下: #include <iostream> using namespace std; class A { public: A() {} ~A() { cout << "in destructor" << endl; } }; void main() { A a; a.~A(); } 如果被破坏的对象再次被破坏,为什么我的应用程序不会崩溃?C++标准,第§12.4节[析构函数] 一旦为对

代码如下:

#include <iostream>
using namespace std;

class A
{
public:
    A() {}
    ~A()
    {
        cout << "in destructor" << endl;
    }
};
void main()
{
    A a;
    a.~A();
}

如果被破坏的对象再次被破坏,为什么我的应用程序不会崩溃?

C++标准,第§12.4节[析构函数]

一旦为对象调用析构函数,该对象就不再存在如果为生命周期已结束的对象调用析构函数,则该行为未定义(3.8)。[示例:如果显式调用自动对象的析构函数,并且随后以通常调用对象隐式销毁的方式保留块,则行为未定义

所以你的程序有未定义的行为,它现在可能崩溃,以后,永远不会,地球可能停止旋转等等…不要这样做

注意:

  • void main()
    必须是
    int main()

  • C++标准第§12.4节[析构函数]

    一旦为对象调用析构函数,该对象就不再存在;如果为生命周期已结束的对象调用析构函数,则行为未定义(3.8)。[示例:如果显式调用自动对象的析构函数,并且随后以通常调用对象隐式销毁的方式保留块,则行为未定义

    所以你的程序有未定义的行为,它现在可能崩溃,以后,永远不会,地球可能停止旋转等等…不要这样做

    注意:

    • void main()
      必须是
      int main()

    “未定义的行为”意味着任何事情都可能发生。崩溃、无崩溃、粉红蝴蝶等“未定义的行为”“任何事情都可能发生。崩溃,没有崩溃,粉红色蝴蝶等。我希望我们永远不知道如何通过破坏在C++中的对象使地球停止旋转:)再次OTALE测试问题,只有以下变量的答案:<代码> 0 B 1 C 2 D。编译时错误将产生,因为析构函数不能被称为可怕。确实你现在真的应该停止阅读那些测试了,去买一些好书。你为什么要通过那项测试?有什么办法可以跟测试人员讲道理吗?你能就糟糕的问题上诉结果吗?@Narek:因为标准是这样说的:它为
    main
    定义了两个签名,并声明任何其他签名都是由confo允许的RING编译器必须有一个返回类型的<代码> int <代码>。我希望我们永远不知道如何通过在C++中破坏对象来停止地球的旋转:)OTALE测试问题,它的答案只有以下的变型:<代码> 0 B 1 C 2 D。ode>你现在真的应该停止阅读那些测试了,去买一些好书。为什么你必须通过那项测试?有没有办法跟测试人员讲道理?你能就糟糕的问题对结果提出上诉吗?@Narek:因为标准是这样说的:它为
    main
    定义了两个签名,并声明任何其他签名都是符合标准的co允许的mpiler的返回类型必须为
    int
    in destructor
    in destructor