静态变量指针?

时间:2010-07-27 00:45:05

标签: c++ c variables static

这是非法/危险吗?

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;

Transition类构造函数会将自身添加到转换中。以这种方式,它将创建一次转换,然后返回指向它们的指针。我只记得如果你创建一个对堆栈上分配的变量的引用,它可能很容易被覆盖并且“不安全”。我对函数中创建的静态变量的确切方式感到有些困惑。

4 个答案:

答案 0 :(得分:6)

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

但是静态数据:

  1. 创建紧密耦合
  2. 妨碍重新入侵
  3. 为微妙的错误创造了机会
  4. 通常是设计薄弱的标志
  5. 应该非常明智地使用
  6. 静态存储类修饰符表示在进程的生命周期内将为此变量保留内存。

答案 1 :(得分:5)

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

许多单身工厂都是这样建造的。

答案 2 :(得分:1)

这是合法的,但请记住,你只会有一个转换实例,它会在你的main()之前构造,因为它被声明为静态。这就像拥有一个全局变量一样。

答案 3 :(得分:-1)

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

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

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

另一方面,这是完全合法的代码。另外,将int替换为您需要初始化一次的struct,这是一个非常有用的习惯用法。