gpt4 book ai didi

c++ - 局部静态变量的销毁

转载 作者:行者123 更新时间:2023-11-30 03:57:53 27 4
gpt4 key购买 nike

我有一个带有两个局部静态变量的函数 f(),其中一个 (t3) 指向动态分配的内存,另一个是普通的 t1(我认为它是在堆栈上分配的。)。

#include <iostream>
#include <string>
using namespace std;

class test
{
public:
test(const char *name): _name(name)
{
cout << _name << " created" << endl;
}
~test()
{
cout << _name << " destroyed" << endl;
}
string _name;
static test tc; // static member
};
test test::tc(".class static data member");

test gvar("..global non-static object ");
static test sgvar("...global static object");

void f()
{

static int num = 10 ; // POD type, init before enter main function
static test tl("..Local static object on (stack???)");
static test* t3 = new test("..Local static object in free store");
test t2("...local non-static object.....");
cout << "Function executed" << endl;
}

int main()
{
cout << "----------------------Program start----------------------" << endl;
test t("LocalToMain non-static object");

f();

cout << "----------------------Program end-------------------------" << endl;
return 0;
}

我得到以下输出

# main                                                           
.class static data member created
..global non-static object created
...global static object created
----------------------Program start----------------------
LocalToMain non-static object created
..Local static object on stack created
..Local static object in free store created
...local non-static object..... created
Function executed
...local non-static object..... destroyed
----------------------Program end-------------------------
LocalToMain non-static object destroyed
..Local static object on stack destroyed
...global static object destroyed
..global non-static object destroyed
.class static data member destroyed
  • 我的问题是
    1. 调用了局部静态 t1 的析构函数,但没有调用局部静态 t3 的析构函数。为什么?
    2. t3 和 t1 的存储期限是多少?
    3. t1 是存储在栈上而 t2 是存储在堆上吗?如果不是,它们存储在哪里?

最佳答案

首先,C++ 规范实际上并没有说明局部(静态或非静态)变量的存储位置,这取决于编译器。

至于你的问题,变量t3 破坏了,但被破坏的是指针,而不是它指向的东西。由于您不删除新建的对象,因此它不会被运行时破坏,并且内存会“泄漏”。

t1t3的生​​命周期都是程序的生命周期。

我不知道 t1 存储在哪里,可能是在加载到内存中的特殊数据段中,但是 t2 是大多数编译器存储的普通局部变量堆栈。

e.g. 之间真的没有太大区别。 numt1。局部静态变量与任何其他局部静态变量一样,无论类型如何。

关于c++ - 局部静态变量的销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27737975/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com