3

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

#define MAX_SIZE_TABLES (1024 * 1024)

unsigned char * ImageBuf = new unsigned char[MAX_SIZE_TABLES];

使用 Microsoft Visual Studio 2010 Premium 编译和构建代码时没有错误。

我的问题:
按照标准或未定义的行为,这是合法的吗?

如果没有函数调用,什么时候删除内存delete

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

4

3 回答 3

7

new不声明变量。它分配内存。声明部分是这样的:

unsigned char * ImageBuf

这:

= new unsigned char[MAX_SIZE_TABLES];

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

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

于 2013-02-20T18:14:21.843 回答
4

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

于 2013-02-20T18:12:06.497 回答
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;
}

并且没有内存泄漏。

于 2013-02-20T18:29:03.033 回答