声明&使用新的外部函数范围初始化变量

时间:2013-02-20 18:10:02

标签: 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编译和构建代码时没有错误。

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

如果没有函数调用delete

,何时删除内存

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

3 个答案:

答案 0 :(得分:7)

new未声明变量。它分配内存。声明部分是:

unsigned char * ImageBuf

在:

= new unsigned char[MAX_SIZE_TABLES];

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

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

答案 1 :(得分:4)

这是合法的,但绝对不推荐。这是一个全球变量。当进程终止时,将释放内存。

答案 2 :(得分:1)

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

 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;
}

并没有内存泄漏。