这是非法/危险吗?
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类构造函数会将自身添加到转换中。以这种方式,它将创建一次转换,然后返回指向它们的指针。我只记得如果你创建一个对堆栈上分配的变量的引用,它可能很容易被覆盖并且“不安全”。我对函数中创建的静态变量的确切方式感到有些困惑。
答案 0 :(得分:6)
这只是静态变量指针的get函数。它没有任何违法行为。它本质上不比任何其他类型的静态数据更危险。
但是静态数据:
静态存储类修饰符表示在进程的生命周期内将为此变量保留内存。
答案 1 :(得分:5)
这是有效的代码,很有用。
许多单身工厂都是这样建造的。
答案 2 :(得分:1)
这是合法的,但请记住,你只会有一个转换实例,它会在你的main()之前构造,因为它被声明为静态。这就像拥有一个全局变量一样。
答案 3 :(得分:-1)
假设你的意思是int* static_nonew( )
一旦你返回指向任何内存位置的指针,那么该内存就可以被覆盖,C中没有保护。
此外,如果将此指针传递给free
,则行为未定义,因此有时它会正常,有时它会转储核心。
另一方面,这是完全合法的代码。另外,将int
替换为您需要初始化一次的struct
,这是一个非常有用的习惯用法。