我的一位同事使用new
:声明并初始化了一个全局变量
#define MAX_SIZE_TABLES (1024 * 1024)
unsigned char * ImageBuf = new unsigned char[MAX_SIZE_TABLES];
该代码使用Microsoft Visual Studio 2010 Premium进行编译和构建,没有出现任何错误。
我的问题:
这是标准的合法行为还是未定义的行为?
如果没有函数调用delete
,何时删除内存?
编辑1:在"为变量声明"之后添加了"initialized"。
new
不声明变量。它分配内存。申报部分是这样的:
unsigned char * ImageBuf
:
= new unsigned char[MAX_SIZE_TABLES];
部分,是初始化,而不是声明。
在全局范围内就地初始化变量是合法的,包括使用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;
}
并且没有内存泄漏。