代码之家  ›  专栏  ›  技术社区  ›  Jonathan Sternberg

静态变量指针?

  •  5
  • Jonathan Sternberg  · 技术社区  · 14 年前

    这是非法的/危险的吗?

    int* static_nonew()
    {
        static int n = 5;
        return &n;
    }
    

    编译器似乎没有问题,但是当其他人需要内存时,指针位置本身是否受到保护而不被覆盖?

    编辑:再解释一下我为什么问这个问题。注:我在C++编程,我只是把它标记为C,因为它似乎比C +问题更多的是C。

    我有一个类应该返回静态映射。我只希望这个映射在整个程序中初始化一次,因为似乎不需要多次初始化。因为这个原因,我会有这样的东西:

    static std::map<std::string, Transition*> transitions;
    static Transition trans1(transitions, ...);
    static Transition trans2(transitions, ...);
    return &transitions;
    

    转换类构造函数将自己添加到转换中。这样,它将创建一次转换,然后返回指向它们的指针。我只记得,如果您创建一个对堆栈上分配的变量的引用,它很容易被覆盖,并且是“不安全的”。我只是对函数中创建的静态变量的工作方式有点困惑。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Nils Pipenbrinck    14 年前

    这是有效的代码,很有用。

    很多单件工厂都是这样建造的。

        2
  •  6
  •   Amardeep AC9MF    14 年前

    这只是一个指向静态变量指针的get函数。没有什么违法的。它本质上并不比任何其他类型的静态数据更危险。

    但静态数据:

    1. 创建紧密耦合
    2. 阻碍重新进入
    3. 为细微的错误创造机会
    4. 通常是设计薄弱的标志
    5. 应该谨慎使用

    静态存储类修饰符意味着在进程的生命周期中将为该变量保留内存。

        3
  •  1
  •   rhinoinrepose    14 年前

    这是合法的,但请记住,您只能有一个转换实例,并且它将在main()之前被构造,因为它被声明为static。这很像有一个全局变量。

        4
  •  -1
  •   Alexander Pogrebnyak    14 年前

    假设你的意思是 int* static_nonew( )

    一旦您返回了指向任何内存位置的指针,那么该内存就可以被覆盖,C中没有保护保证。

    另外,如果将此指针传递给 free ,该行为是未定义的,因此有时会正常,有时会转储核心。

    另一方面,这是完全合法的准则。另外,替换 int 对一些 struct 需要初始化一次,这是一个非常有用的习惯用法。