2

C ++では、関数は、関数のスコープを終了するときに動的に割り当てられたメモリをどのように処理しますか?このメモリはクリアされていますか、それともメインブロックに戻すことができますか?

コンテキスト:関数があり、配列として機能するdoubleへのポインターを渡します。このメモリを関数内に動的に割り当て、要素を初期化して関数を終了します。

            void my_func(double* ptr){
            ptr = new double[2];
            ptr[0] = 15; ptr[1] = 10;
            }

次に、メインブロックで、新しく割り当てられた配列を使用します。

            int main(){
            double* ptr;
            my_func(ptr);
            cout << ptr[0] + ptr[1] << endl;
            delete[] ptr;
            return 0;

これは機能しますか?このアプローチに関連する危険/落とし穴はありますか?

4

2 に答える 2

11

C ++では、関数は、関数のスコープを終了するときに動的に割り当てられたメモリをどのように処理しますか?このメモリはクリアされていますか、それともメインブロックに戻すことができますか?

C ++では、手動で(動的に)割り当てられたメモリを手動で割り当て解除する必要があります。

コンテキスト:関数があり、配列として機能するdoubleへのポインターを渡します。このメモリを関数内に動的に割り当て、要素を初期化して関数を終了します。

ポインタを値で取得しているため、ポインタが指す内容を変更することはできますが、ポインタ自体を変更することはできません。これを行うと、ポインタのローカルコピーのみが変更されます。ポインタを参照して取得すると、次のように機能します。

void my_func(double*& ptr)
{
    ptr = new double[2];
    ptr[0] = 15; ptr[1] = 10;
}

これは機能しますか?このアプローチに関連する危険/落とし穴はありますか?

ほとんどの場合は機能しますが、関連する落とし穴があるため、C++で使用する方法ではありません。と一緒に行く方がいいvectorです:

std::vector<int> my_func()
{
    std::vector<int> buffer;
    buffer.push_back(15);
    buffer.push_back(10);
    return buffer;
}
于 2012-05-30T15:39:26.493 に答える
0

これは機能しますか?このアプローチに関連する危険/落とし穴はありますか?

何も問題がない限り、機能する可能性があります。例外がスローされると、通常、メモリがリークします。これを回避するには、通常、あるクラスのデストラクタのメモリを解放してから、自動保存期間を使用してそのクラスのインスタンスを作成します。つまり、スコープ外になると破棄され、(順番に)制御しているメモリが解放されます。

標準ライブラリには、それを行うためのさまざまなコンテナがすでにあります。あなたが持っているものはに最も近いですが、などstd::vectorもあります。std::dequestd::list

于 2012-05-30T16:28:36.937 に答える