0

次のコードは問題なく動作しますが、returned_arrayポインターを削除する必要があるint main()かどうか、または自動的に削除されるかどうかはわかりません。自動的に削除されないと推測し、終了delete returned_array;後に使用する必要があると想定coutします。助言がありますか?

#include <iostream>

double* pass_return_array(double passed[])
{
        double* returned_array = new double[3];

        for(int index = 0; index < 3; index++)
            returned_array[index] = passed[index];

        return returned_array;
}
int main()
{
        double passed[3];
        double* returned_array;

        for(int index = 0; index < 3; index++)
            passed[index] = index + 100;

        returned_array = pass_return_array(passed);

        for(int index = 0; index < 3; index++)
            std::cout<<returned_array[index]<<std::endl;

        return 0;
}
4

2 に答える 2

4

その通りです。関数内で配列を作成したので、その割り当て解除についても責任があります。delete[] returned_array;必要がなくなったらすぐに電話する必要があります。

OS は、プログラムの終了時に、プログラムによって割り当てられたすべてのリソースを常にクリーンアップするため、システム全体のメモリ リークが発生しないことに注意してください。ただし、割り当て解除を OS に任せるのは非常に悪い習慣です。割り当てたすべてのリソースを常に割り当て解除する必要があります (ファイルやブラシへのハンドルなど、他の種類のものも含まれます)。

std::vector代わりにorを使用することを検討してくださいstd::array。単純なローカル変数として使用すると、割り当てられたメモリが処理されるため、覚えておく必要はありません。それが仕事におけるC++の力です​​:)

于 2013-05-14T04:28:35.133 に答える
2

割り当てたすべてのリソースを自動的にクリーンアップするかどうかに関係なく、クリーンアップすることをお勧めします。

また、リソースの責任がリソース自体に従うことも良い習慣です。つまり、関数から動的に割り当てられたメモリを返す場合、その責任も「返す」ことになります。

カプセル化が壊れる可能性があるため、関数呼び出し元でクリーンアップする必要があるとは言えません (動的に割り当てられているかどうかは必ずしもわかりません)。ただし、リソースをそれを作成したコード/ライブラリに戻しても、次の疑似コードのように、責任も渡されます。

def makeSomething():
    something = unknownMethodForCreatingSomething()

    #makeSomething() has responsibility here but passes it off to caller

    return something

def killSomething(something):
    # Responsibility with killSomething() at this point

    equallyUnknownMethodForDestroyingSomething(something)

def main():
    xyzzy = makeSomething()

    # main() has responsibility for xyzzy here but hands it off in next line

    killSomething (xyzzy)
于 2013-05-14T04:31:22.583 に答える