1. ホーム
  2. c++

[解決済み] オブジェクトの作成: `new` の有無 [重複].

2022-07-22 10:47:55

質問

重複の可能性があります。

オブジェクトのインスタンス化をnewで行うか、newで行わないかの違いは何ですか?

これはおそらく基本的な質問であり、すでに質問されているかもしれません(例えば ここで のように)、しかし、私はまだそれを理解していないのです。そこで、質問させてください。

次のようなC++のクラスを考えてみましょう。

class Obj{
    char* str;
public:
    Obj(char* s){
        str = s;
        cout << str;
    }
    ~Obj(){
        cout << "Done!\n";
        delete str;        // See the comment of "Loki Astari" below on why this line of code is bad practice
    }
};

次のコードスニペットの違いは何ですか。

Obj o1 ("Hi\n");

Obj* o2 = new Obj("Hi\n");

前者はデストラクタを呼び出しますが、後者は呼び出さないのはなぜでしょう (明示的に delete )?

どれが好ましいですか?

どのように解決するのですか?

どちらも違うことをします。

一つ目はオブジェクトを 自動保存期間 . これは作成、使用され、そして現在のブロック ( { ... } )が終了した時点でスコープ外になります。これは、オブジェクトを作成する最も簡単な方法です。 int x = 0;

2つ目は、オブジェクトを 動的な保存期間 を作成し、2つのことを可能にします。

  • オブジェクトは自動的にスコープ外に出ないため、オブジェクトの寿命を細かく制御することができます。 delete ;

  • オブジェクトの作成が実行時に行われるため、実行時にのみサイズがわかる配列を作成すること。(ここでは動的配列の割り当ての詳細については触れません)。

どちらが望ましいというわけではありません。どちらが最も適切かについては、あなたが何をしているかによります。

後者を使う必要がない限り、前者を使いましょう。

C++の本がこれをよくカバーしているはずです。持っていない場合は これ以上進めない を買って何度か読むまで、この先には進みません。 このうちの一つ .

頑張ってください。


あなたの元のコードは、次のように壊れています。 deletechar という配列は new . 実際には 何も new C-styleの文字列は、文字列リテラルに由来しています。 delete というのはエラーです(ただし、コンパイルエラーではなく、実行時に予測不可能な動作をするものです)。

通常、オブジェクトには delete の責任を負うべきではありません。 new . この動作は十分に文書化されるべきです。この場合、そのルールは完全に破られています。