1

C および C++ でメモリを解放する場合、メモリ アドレスのみが必要ですか、それとも特定の変数が必要ですか?

したがって、次のようなことをするとしたら:

int* test()
{
    int* x = new int(5);
    return x;
}

int main(int argc, char** argv)
{
    int* y = test();

    delete y;

    return 0;
}

これによりメモリリークが発生しますか? ありがとう!

4

4 に答える 4

2

あなたのコードは、そのままではリークしません(他の人がすでに言っているように)。ただし、壊れて漏れる可能性はほとんどありません。

int* test()
{
    int* x = new int(5);
    return x;
}

int main(int argc, char** argv)
{
    int* y = test();
    int* z = test();
    delete y;
    delete z;
    return 0;
}

このコードは、スローされる可能性があるため、リークする可能性があります。 ( )newへの 2 番目の呼び出しがスローされると、最初のポインター ( ) は決して削除できません。スローできる他の関数 ( への 2 回目の呼び出しだけでなく) も、同じ問題を引き起こします。newz=...ynew


これが、スマート ポインターが必須である理由です。スマート ポインターは RAII を使用し、適切な C++ の基礎である例外セーフ コードを記述できるようにします。このコードは単にリークすることはありません:

std::unique_ptr<int> test()
{
    std::unique_ptr<int> x(new int(5));
    return x;
}

int main(int argc, char** argv)
{
    std::unique_ptr<int> y = test();
    std::unique_ptr<int> z = test();
    return 0;
}
于 2013-05-21T07:07:17.720 に答える