2

私は通常、C++ 開発者ではありません。私の通常の言語はすべてガベージ コレクションされており、それらは私に代わって作業を行いますが、C++ には興味があります。

動的に割り当てられたオブジェクトまたは構造体を返すことについて、1 つまたは 2 つの質問があります。データがスタックではなくヒープにあるように、それらを動的に割り当てる必要があることは私の理解です。私が間違っている場合は、私を修正してください。

ポインターを返すためのベスト プラクティスは何ですか? ライブラリを作成しているとします。返されたポインタを削除する必要があるかどうか、いつ削除する必要があるかをコードでどのように示すのですか? 配列を返す場合、配列のサイズを返すにはどうすればよいですか?

これらは、C# や JavaScript で直面しなければならない問題ではありません。これらの質問はどちらにも当てはまります。他の人のライブラリを使用している場合、何を探しますか?

4

2 に答える 2

5

C++ には RAII というイディオムがあります。これが意味することは、クリーンアップについて心配する必要がなく、コード内の定義されたポイントでリソースが解放されるということです。

たとえば、関数で配列を作成し、それを返します。以下は、RAII を使用しない典型的な実装の 1 つです (もう 1 つは、メモリを割り当てて渡す呼び出し元です)。

int *makeIntArray(std::size_t length) {
    return new int[length];
}

ここで、呼び出し元はこのメモリを解放することを覚えておく必要があります。これを RAII バージョンと比較します。

std::vector<int> makeIntArray(std::size_t length) {
    return std::vector<int>(length);
}

これから返されるものは、ベクトルがスコープ外になるとメモリの割り当てが解除されますが、これは呼び出し元次第です。size()また、要素数を取得するメンバー関数なども提供します。

そうは言っても、可能であれば動的に割り当てられないようにするのが最善です。たとえば、構造体を返す必要がある場合はStr、値で返すだけです。

Str makeStr() {
    return Str();
}

std::unique_ptr動的割り当てがないということは、メモリを解放するか、何か (この場合のようなスマート ポインター) にラップするかどうかにかかわらず、余分な作業がないことを意味します。

他のライブラリについては、ドキュメントを読んで、それが返すものを所有していることを確認する必要があります。必要に応じて、できることの 1 つは、そこから RAII オブジェクトを作成することです。例えば:

int *makeSomeInt(int value) {
    return new int(value);
}

...

std::unique_ptr<int> myInt(makeSomeInt(5));
//memory freed when myInt goes out of scope
于 2013-01-24T03:31:01.710 に答える
0

クリスはすでに素晴らしい答えを提供しているようです。それに追加するいくつかのこと:

  • コード内で動的メモリを割り当てないようにしてください。動的メモリ割り当て (および割り当て解除) は、可能な限りライブラリによって行われます。(vector上記の例を参照してください。)

  • 自分で動的メモリ割り当てを行う必要がある場合は、すべてのメモリ (つまりポインタ) に所有者が必要です。メモリを構築および破壊するのは所有者であり、他の人はそれを使用することしかできません。

  • C++11 を使用している場合unique_ptrは、最も一般的に必要となる に慣れてください。

    Dr.ドブスより:

    C++11 には多くの優れた機能がありますが、unique_ptr はコード衛生の分野で際立っています。簡単に言えば、これは動的に作成されたオブジェクトの特効薬です。

于 2013-01-24T04:15:18.573 に答える