0
void fun()
{
    A *a = new A;   //Here A is a class
}                   //a should be deleted in fun()'s scope

int main()
{
    fun();
    return 0;
}

作成されたオブジェクトはフリー ストアに存在し、main() 関数で使用できません。オブジェクトをフリー ストアに作成する理由。はい、オブジェクト参照をメイン関数に渡すことができますが、オブジェクトのコピーを渡すこともできます (new 演算子を使用して作成されていない場合でも)。では、new 演算子と delete 演算子の正確な用途は何ですか?

4

4 に答える 4

6

簡単な答え: 実行時にメモリを割り当てます。

詳細については、http ://www.cplusplus.com/doc/tutorial/dynamic/ を検討してください。

于 2013-08-23T06:59:55.623 に答える
3

In your example, there is none, and it isn't good practice to use dynamic allocation. Dynamic allocation is used when objects have identity (or cannot be copied for some other reason), and the lifetime of the object does not correspond to some pre-determined lifetime, like static or auto. Dynamic allocation may also be used in a few cases where copying is expensive, and the profiler shows that the copying is a bottleneck; in such cases, using dynamic allocation and copying a pointer may remove the bottleneck. (But this should never be done until profiling shows it necessary.)

于 2013-08-23T08:15:33.550 に答える
1

良い質問。通常、明示的には必要ありません。確かに、「実行時にメモリを割り当てる」という別の回答と同様のコメントがあります。しかしstd::vector<>std::stringなどでも同じことを達成できます。それらは、適切なタイミングで、舞台裏ですべてのメモリ処理を行います。

これが理由の 1 つnew/deleteです。いくつかのクラスを実装すると便利です。

オブジェクトのコピーを渡すことができると述べています。これは少しコストがかかる可能性があるため、最適化のために、最もコストのかかるコピーを に置き換える価値がありnew/deleteます。どのコピーが高価であるかを識別するために使用できる「プロファイラー」と呼ばれるツールがあります。

3 つ目の理由は、ポリモーフィズムです。Base* ptr = (foo>7) ? new Derived1 : new Derived2(foo);どのオブジェクトが必要なのか、そのオブジェクトがどのように動作するのかを事前に知らない場合と同様のコードがある場合があります。Derived1とのサイズDerived2は通常無関係であるため、必要なメモリ量は実行時にしかわかりません。

于 2013-08-23T07:46:33.507 に答える
0

重要な理由は、スタックがどのように機能するかです。プッシュ操作とポップ操作しかありません。その後にプッシュされたものをすべて解放する前に、スタック内の何かを解放することはできません。または、別の言い方をすれば、関数が戻るときに関数呼び出しのスタック フレームなど、何かがスタックから解放された場合、スタック内のその上にあるすべてのメモリも解放されます (適切に破棄されることを確認することをお勧めします。以下を参照してください)。 )。

プログラムは通常、スタックとは別にデータを格納する必要があります。コンパイル時にstatic dataとしてメモリを割り当てる方法と、heap とも呼ばれるフリー ストアにメモリを割り当てる方法の 2 つがあります。

複数のスタックを持つことは確かに可能であり、実際、便利で便利な場合には、これも一般的に行われます。しかし、それは、 などのタイプのスタック コンテナ変数を使用して行われstd::stack、それをデータ専用の追加スタックとして使用します。一般的なプロセッサ アーキテクチャには、プロセス/スレッドごとに「ネイティブ」スタックが 1 つだけあり、それが関数呼び出しとスタック変数に使用されます。これらの余分なスタックは常に分離され、プログラム コードによって作成されます。リストやマップなどと同じ単純なデータ構造です。


あなたの質問のコードについて、指摘すべき点は、現代の C++ ではnew一般的にネイキッドは嫌われているということです。スマート ポインターなどの RAII メカニズムを使用する必要があります。

void fun()
{
    auto a = std::unique_ptr<A>{ new A };   // C++11 syntax
    // object is automatically destroyed when a goes out of scope, no leak
    // note: heap should be used like this only if there's a reason, including:
    // - A is big, and might conceivably overflow the stack
    // - ownership of object may get moved and outlive the unique_ptr

}        

そして、あなたの特定の質問「作成されたオブジェクトはフリーストアに存在し、main()関数では使用できません。なぜオブジェクトをフリーストアに作成する必要があるのか​​ 」、まあ、質問コードでは作成しないでくださいフリーストアでは、理由はありません。スコープ外になると自動的に破棄される単純な自動変数でなければなりません。

于 2013-08-23T07:48:54.600 に答える