【问题标题】:What is the life time of a C++ data structure object?C++ 数据结构对象的生命周期是多少?
【发布时间】:2011-07-15 03:08:44
【问题描述】:

假设我有一个 Car.h 定义了一个名为 Car 的类,并且我有实现 Car.cpp 来实现我的 class Car,例如我的 Car.cpp 可以是:

struct Helper { ... };
Helper helpers[] = { /* init code */  };
Car::Car() {}
char *Car::GetName() { .....}

helpers 数组的生命周期是多少? 我需要说static Helper helpers[]; 吗? 如果我做了一些不好的做法,请告诉我。

【问题讨论】:

    标签: c++ data-structures object-lifetime


    【解决方案1】:

    在全局/命名空间范围内声明/定义的任何变量都有完整的生命周期,直到代码结束。

    如果您希望您的Helper helpers[]; 只能在Car.cpp 内访问,那么只有您应该将其声明为static;否则让它成为一个全球性的。换句话说,

    Helper helpers[];        // accessible everywhere if `extern`ed to the file
    static Helper helpers[];  // accessible only in `Car.cpp`
    

    编辑:正如@a​​ndrewdski 在下面的评论中建议的那样;您应该将helpers[] 设为static 变量,因为您在此文件中使用它;即使Helper 在外面是不可见的。在 C++ 中,如果 2 个完全不同的单元具有相同命名的全局变量,那么编译器会静默将它们引用到相同的内存位置,从而造成混乱。

    【讨论】:

    • 我发布了一个误解了问题的答案,但这是正确的。我以为他发布的代码是头文件!无论如何,我会说最佳做法是使用 static 使 helpers 成为 .CPP 文件的本地文件(假设这似乎是意图)。
    • @andrewdski,是的,你是对的。但是,由于Helper 是在.cpp 文件中声明的,因此helper[] 是否设为static 都不会产生任何影响。
    • 会污染全局命名空间。假设他后来编写了一个 Truck.cpp,它也需要一个 helper 数组。
    • @iammilind,为了澄清 andrewdski,这个名字变成了一个全球可见的名字helper。如果另一个文件声明了一个名为helper 的不同对象,您将收到有关重复符号的链接器错误。或者,另一个文件可以使用extern 并获得对原始helper 变量的访问权限。为了防止这种情况,必须使用static 或匿名命名空间。
    • @edA-qa mort-ora-y,是的,我当时明白了他的意思。我已经编辑了我的答案。谢谢@andrewdski,我错过了类似名字的问题
    【解决方案2】:

    在文件范围内定义的对象称为Static Storage Duration 对象。

    在大多数情况下,您可以将它们视为在 main() 进入之前创建并在 main() 退出之后销毁(有例外,但我不会担心)。

    • 静态存储时长变量的销毁顺序与创建顺序相反。

    • 在同一个编译单元(文件)内的创建顺序就是它们被声明的顺序。

      • 注意:不能保证Static Storage Duration 对象在不同编译单元之间的创建顺序。

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2011-09-21
      • 2013-06-11
      相关资源
      最近更新 更多