Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 申报及;使用新的、超出函数范围的变量初始化_C++_Visual Studio 2010_Memory Management_Global Variables_New Operator - Fatal编程技术网

C++ 申报及;使用新的、超出函数范围的变量初始化

C++ 申报及;使用新的、超出函数范围的变量初始化,c++,visual-studio-2010,memory-management,global-variables,new-operator,C++,Visual Studio 2010,Memory Management,Global Variables,New Operator,我的一位同事使用new声明并初始化了一个全局变量: #define MAX_SIZE_TABLES (1024 * 1024) unsigned char * ImageBuf = new unsigned char[MAX_SIZE_TABLES]; 该代码使用Microsoft Visual Studio 2010 Premium编译和生成时没有错误 我的问题: 这是标准行为还是未定义的行为 如果没有函数调用,内存何时被删除 编辑1:在“为变量声明”之后添加“已初始化”。这是合法的,但绝

我的一位同事使用
new
声明并初始化了一个全局变量:

#define MAX_SIZE_TABLES (1024 * 1024)

unsigned char * ImageBuf = new unsigned char[MAX_SIZE_TABLES];
该代码使用Microsoft Visual Studio 2010 Premium编译和生成时没有错误

我的问题:
这是标准行为还是未定义的行为

如果没有函数调用,内存何时被删除


编辑1:在“为变量声明”之后添加“已初始化”。

这是合法的,但绝对不建议使用。它是一个全局变量。进程终止时将释放内存。

new
不声明变量。它分配内存。声明部分如下:

unsigned char * ImageBuf
委员会:

部分是初始化,而不是声明


在全局范围内就地初始化变量是合法的,包括使用
new
或函数调用。程序不会自动释放内存(手动分配的内存永远不会自动释放;分配发生在何处无关紧要。)当进程退出时,操作系统会释放内存(以及所有通常的清理,如关闭文件等),但这当然是特定于平台的。从程序的角度来看,内存在其生命周期内永远不会被释放。

这样做是可以的,但是这样做的好处是什么:

 unsigned char ImageBuf[MAX_SIZE_TABLES];
这个解决方案占用的内存少了一点(指针的大小加上
new
分配内存的开销,至少16个字节,很可能是40-60个字节),程序的代码更短,但这两个都不是缺点

或者,您可以执行以下操作:

unsigned char *ImageBuf;

int main()
{
    ImageBuf = new unsigned char [MAX_SIZE_TABLES];

    ...  all other code that belongs in main ... 

   delete ImageBuf;
}

并且没有内存泄漏

这就是
new
操作符的“多态性”的美妙之处:它不是
malloc()
,而是(黑色)魔法。@ H2CO3:我确信你可以用<代码> MalOC/来做。我以前没有看到这个用法< Cux>新< /C>在C++程序之前,也不知道这是不是微软的特性。@ MooIdCuth@ H2CO3: C++,这个问题是C++。我的观点仅仅是,在这种情况下,
new
没有使用黑魔法。很抱歉,使用C构造会造成混淆:(我没有看到在全局初始化中使用
new
。这是问题的细节:在全局变量初始化中使用
new
合法吗?@ThomasMatthews:您几乎可以使用任何函数初始化全局变量,包括
new
@ThomasMatthews是的,这是合法的。我现在在nswer.@MooingDuck:哇,现在我们可以击打主要肢体,而不仅仅是击打自己的脚!啊,使用使用使用其他函数和外部依赖项的独立函数初始化全局变量的潜力!@ThomasMatthews:您甚至可以从未初始化的全局初始化全局变量。这是一个需要调试的PITA。那么为什么def将
ImageBuf
作为一个全局变量(这里的第一个备选方案)而不是内存泄漏,而使用
new
而不删除is?似乎是一个双重标准…
的好处是编译器通常比动态区域(堆)中的自动(全局)变量空间更小。初始化表明,您提出的经典替代方案是可以避免的。这对我来说是新闻。我们在这里讨论的是什么编译器/操作系统?1990年,我在OS/2中编写了一个应用程序,它使用静态分配的缓冲区来跟踪串行通信,并在两侧使用了几兆字节,以确保任何延迟都不会发生日志记录仍然允许接收方/发送方继续。在我的机器上,我刚刚用g++编译了一个程序,以使用12GB全局缓冲区-是的,我必须使用
-mcmodel=large
才能正确构建。需要几秒钟的时间来循环所有12GB来填充它[我对变量的“使用”,以确保它实际工作].
unsigned char *ImageBuf;

int main()
{
    ImageBuf = new unsigned char [MAX_SIZE_TABLES];

    ...  all other code that belongs in main ... 

   delete ImageBuf;
}