3

私の同僚の 1 人が、次を使用してグローバル変数を宣言し、初期化しました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 バイト)、プログラムのコードは短くなりますが、確かにこれら 2 つのどちらも欠点ではありません。 .

または、これを行うことができます:

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 に答える