0

私は次のことをしています:

LRESURT CALLBACK WindowProc{
    .......
    Case VK_RETURN:
        int i;
        for ( i = 0; i <1000; i++) {
            int  size = determinesize(i);
            int *pttest = new int[size];
            .....(some work)....
            delete[] pttest;
        }
     ........
}

しかし、発生すると問題がVK_RETURN発生しました。使わないとdelete[] pttest

私の質問は次のとおりです。ptttest を削除する必要がありますか? 私がグーグルで検索すると、ほとんどの人が新しいものごとに削除があるに違いないと言いました。もう 1 つの質問は、for ループ コード forVK_RETURNを関数内に配置した場合、たとえばvoid whenvkreturn()pttest を削除する必要があるかどうかです。戻った後にローカル変数は破棄されるので、このループで作成された 1000 個のオブジェクトは自動的に削除されるのではないでしょうか。私はスタックをよく知らないので、私が見つけたいくつかの説明は私にとって明確ではありません。

=====

OK、ベクトルの回避策があります。しかし、その場合:

TCHAR *text = new text[size];

私は何をすべきですか?

4

5 に答える 5

1

コードをそのままにしておくと、delete や new を使用する必要はありません。

int size = determinesize(i);
std::vector<int> test( size );
.....(some work)....

スタックベースのソリューションも同様に機能します。そのままにしておく場合は、もちろんこの時点で削除する必要pttestはありませんが、いつか削除する必要があり、スイッチから外すと正しく動作しなくなるリスクが高くなりますそして傾きます。

于 2012-05-18T13:47:17.847 に答える
1

割り当てられたメモリを常に削除する必要があります。関数内であっても、 newごとにdeleteが必要です。あなたが近づいている問題は、std::vector のような動的サイズの他のコンテナーを使用することで簡単に解決できます。ローカル関数で動的コンテナーを使用すると、それ自体が割り当てたメモリが自動的に解放されるため、心配する必要はありません。

于 2012-05-18T13:45:01.403 に答える
1

あなたの質問に関しては、はい、pttest意図的にメモリをリークしたくない限り、を削除する必要があります。new基本的に、 /new[]で何かを割り当てるときはいつでも、必要がなくなったときに手動でdelete/にする必要があります。delete[]

std::vectorただし、で割り当てられた配列の代わりに使用することを検討する必要がありますnew[]delete[]でメモリを解放することを心配する必要はありませんstd::vector。デストラクタで自動的に解放されます。

于 2012-05-18T13:45:18.420 に答える
1

C++ で new または new[] 操作を使用してポインターを作成すると、ヒープにメモリが割り当てられます。これは、メソッドでこれを行う場合でも当てはまります。そのため、ヒープ メモリの割り当てを解除するには、必要に応じて delete または delete[] を使用する必要があります。

于 2012-05-18T13:53:25.060 に答える
1

原則として、最近では決して new[] を使用しないでください。また、削除しないでください。代わりにベクターを使用してください。効率をさらに高めるには、同じベクトルを再利用してサイズを変更し、1000 個の個別の配列を割り当てないようにします。

vector<int> test;

for(int i = 0; i < 1000; ++i) {
    test.resize(determinsize(i));
    ...
}
于 2012-05-18T15:58:01.050 に答える