请问这个撤销顺序为什么是先3后4

#include class CreateAndDestroy {public:CreateAndDestroy(int n){no=n;cout << "Object " << no << " created!" << endl;}~CreateAndDestroy(){cout << "Object " << no << " destructed!" << endl;}private:int no;};CreateAndDestroy one(1); // 定义全局对象 oneint main(){CreateAndDestroy *ptr;CreateAndDestroy two(2); // 定义局部动态对象 two{CreateAndDestroy three(3); // 定义局部动态对象 threeptr=new CreateAndDestroy(4); // 动态创建对象static CreateAndDestroy five(5); // 定义局部静态对象 five}delete ptr; // 释放动态创建的对象return 0;}


#include <iostream>

using namespace std;

class CreateAndDestroy 
{
public:
    CreateAndDestroy(int n)
    {
        no=n;
        cout << "Object " << no << " created!" << endl;
    }~
    CreateAndDestroy()
    {
        cout << "Object " << no << " destructed!" << endl;
    }
private:
    int no;
};

CreateAndDestroy one(1); // 定义全局对象 one

int main()
{
    CreateAndDestroy *ptr;
    CreateAndDestroy two(2); // 定义局部动态对象 two
    
    {
        CreateAndDestroy three(3); // 定义局部动态对象 three
        ptr = new CreateAndDestroy(4); // 动态创建对象
        
        static CreateAndDestroy five(5); // 定义局部静态对象 five
    } // object 3 is allocated on stack and its scope is within the block. Approaching the end of the block causes destroying this object. While object 4 is allocated in heap memory and is not destroyed at the end of the block.
    
    delete ptr; // 释放动态创建的对象
    return 0;
}


/// Output
Object 1 created!
Object 2 created!
Object 3 created!
Object 4 created!
Object 5 created!
Object 3 destructed!
Object 4 destructed!
Object 2 destructed!
Object 5 destructed!
Object 1 destructed!

因为three是main函数内的一个语句块里的局部变量,它分配在栈上。它的生命期仅仅限于这各语句块。当执行到这个语句块结束时,它就被释放了。

而对象4时分派在堆上。到局部语句块结束时并不会自动释放堆上的对象。要到delete ptr时才释放。

你在CreateAndDestroy three(3)前面加了大括号,大括号内为独立的程序段,three是在该段内的临时变量,出了大括号就释放了。而4是new出来的,ptr指针是在外部定义且在外部delete的

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632