本地静态变量的销毁

4

我有一个名为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存储在堆上吗?如果不是,它们存储在哪里?

t3是指向test对象的原始指针 - 它本身不是一个test对象,因此析构函数不会自动调用。 - Michael Burr
好的,我同意static t3是一个名称,并且是指向内存区域的指针。如何调用析构函数并释放内存?将静态指针指向堆对象是设计缺陷吗? - Sree
1
在管理由 new 分配的内存所有权时,始终使用“智能指针”。在这种情况下,unique_ptr 是一个不错的选择: http://en.cppreference.com/w/cpp/memory/unique_ptr。 - Alan Stokes
1个回答

4
首先,C++规范实际上并没有说明本地(静态或非静态)变量存储在哪里,这取决于编译器。
至于你的问题,变量被销毁了,但是被销毁的是指针而不是指向的内容。由于你没有使用删除你用创建的对象,所以它不会被运行时销毁,内存将会“泄漏”。 和的生命周期是程序的生命周期。
我不知道存储在哪里,可能是存储在内存中的特殊数据段中,但是一个普通的局部变量,大多数编译器将其存储在堆栈上。
例如和之间实际上没有太大的区别。局部静态变量就像任何其他局部静态变量一样,无论类型如何。

如果在文件作用域中的静态变量析构函数调用了带有静态局部变量的函数,那么在所有文件作用域中的静态变量完成后销毁静态局部变量是有意义的,但我不知道是否是这种情况。 - fuzzyTew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接