C ++中的静态全局变量
我想通过malloc方法创建一个整数数组。 我希望这个数组是全局的,并可以在我的程序中的任何地方使用。 我把代码放在一个如下所示的头文件中:
static int *pieces;
然后我有一个函数,用它填充我想要的数字。 该函数位于命名空间中,命名空间在其自己的.cpp文件中实现。 但是,我将头文件导入到main.c中,并从创建数组的名称空间调用该函数,如下所示:
pieces = malloc(sizeof(int) * 128);
但是当我尝试访问main中的数组(在调用创建我的数组的函数之后)时,它崩溃并且说块没有被初始化。 但在函数中,我可以创建它并在其中操纵数字就好了。 我的印象是,只要某个函数在任何地方发生变化(或设置了它),就会使块变为一个静态变量,这会影响变量在任何地方的使用。 基本上我想说的是,为什么在主要中出现未设置的部分,即使我将其设置为我调用的函数?
Static
是一个有很多含义的关键字,在这个特殊情况下,它意味着不是全局的 (释义)
这意味着每个.cpp
文件都有自己的变量副本 。 因此,当你在main.cpp
初始化时, 它仅在main.cpp
初始化 。 其他文件仍然未初始化。
首先要解决这个问题是删除关键字static
。 这会导致“多重定义问题”。 为了解决这个问题,你应该在一个.cpp
文件中定义变量,并且只是在头文件中声明它。
编辑:你只是分配内存, 不算作初始化 。 分配后需要将内存初始化为0。
您可以使用new int[128]()
而不是更详细的malloc
语法,并且这也会执行初始化? 或者你可以走容易的道路(这就是它的目的),并使用std::vector
关键是这样的:
static int *pieces;
你说你把它放在你的标题中。 这不是导出符号的方式。 包含头文件的任何文件都将获得它自己的静态版本的未初始化指针,称为pieces
。
相反,你把它放在你的标题中:
extern int *pieces;
extern int init_pieces();
在源文件中,您可以这样做:
static const size_t num_pieces = 128;
int *pieces = 0;
int init_pieces()
{
pieces = malloc( num_pieces * sizeof(int) );
return pieces != NULL;
}
现在,当你包含你的头文件时,你的源文件将知道从别的地方得到代码pieces
,并且会等待链接器找出它的位置。 我还为数组提供了一个'init'函数。 然而,我没有放置“释放”功能。
注意这是所有C,而不是C ++。 如果你使用C ++,你应该真的使用new
或更好的,使用一个vector
。
另外,当在C ++中使用静态时,请注意这一点:C ++静态初始化顺序
对于各种体系结构中的高性能代码,您可能需要malloc-y分配而不是通用新分配。 这是因为你会用类似mymalloc()的东西包装它,然后使用架构相关函数,比如那些实现适当对齐的函数,以避免缓存未命中,并执行硬件制造商提供的其他漂亮的东西,比如IBM(Bluegene)或英特尔(MIC)。 所有这些优化的分配例程都有malloc类型框架。
链接地址: http://www.djcxy.com/p/35323.html