0

まず第一に、これが重複していないことを願っています。私は Java プログラマーで、現在 C++ に変更しています。Javaでは、このようにすることができます

 Object obj = new Object();

そして、私の理解では、次のようにC ++で同じことができます(Javaのobjが変数に参照としてのみ保存される方法を確認してください):

Object* obj = new Object();

私の質問はこれです: このオブジェクトはどのくらい生きていますか? ポインタが生きている限り生きますか?また、オブジェクトのメンバー初期化を行うことは可能ですか? もしそうなら、ポインターがメンバー変数として保存されている限り、オブジェクトは生き続けますか (あなたがそれを保存しているオブジェクトが破棄されるまで)?

誤字脱字はご容赦ください。良い一日/夜を!

4

5 に答える 5

6

オブジェクトは、誰かがdeleteそれを指すポインターを呼び出すまで存続します。他に選択肢がなく、自分が何をしているのかを本当にnew理解しているライブラリ機能を実装する場合を除き、 and を使用しないでください。デフォルトのアクションは、スマート ポインターを初期化するか、メモリ管理を処理するクラスに挿入する場合を除き、直接使用しないでください。deletenew

これは、デフォルトで構築された のインスタンスを作成する C++ の方法ですObject

Object obj; // calls the default constructor
于 2013-02-25T21:30:23.753 に答える
2

このオブジェクトはどのくらい生きていますか?

あなたが明示的deleteにそれまで。Java とは異なり、動的にインスタンス化される C++ のオブジェクトnewはユーザー制御の有効期間を持ち、ガベージ コレクションされないため、オブジェクトへのすべての参照が消えても自動的に解放されません。その動作が必要な場合は、std::auto_ptrとのようなクラスがあり、それstd::unique_ptrを処理します。

于 2013-02-25T21:32:23.467 に答える
1

このようなオブジェクトを作成します。

.h ファイルには、次の Object *foo; があります。

.cpp クラスでは、Java と同様にクラスを初期化します。

foo = 新しいオブジェクト();

次に、delete キーワードを使用して削除します。この場合は foo を削除します。

私はあなたと同じような船に乗っています。ポインター (* のこと) に頭を悩ませることを強くお勧めします。これは非常に強力です。

編集: 上記のように、 Object foo を実行して、ヒープではなくスタックにオブジェクトを作成することもできます。

于 2013-02-25T21:32:21.013 に答える
0

C ++には保証されたガベージコレクターがないため、明示的に削除されるまで存続します。

ポインターを使用したい場合で、もう少し管理されたものが好きな場合は、スマートポインターを使用できます

std::unique_ptr<Object> Obj = new Object();

リンクされた回答に従って、いくつかの異なるタイプのスマートポインターがありますが、基本的に、スマートポインターは、オブジェクトがスコープ外になると自動的にオブジェクトを破棄します。

あなたの質問のメンバー初期化部分に関してはあなたがすることができます

TestMe()
{
  Object Obj();

  //Do something with object

}

次に、Objはスタック上に作成され、スコープ外になると自動的に破棄されます。

于 2013-02-25T21:57:23.063 に答える
0

C または C++ では、削除されるまで存続します。通常、リソースの割り当て/割り当て解除 (new/delete および malloc/free の呼び出しを含む) は、ctor dtor ペアでラップします。例えば

class ObjectManager
{
public:
    ObjectManager()
        : mObjectPtr(0)
    {
        mObjectPtr = new Object();
    }

    ~ObjectManager()
    {
        delete mObject;
    }
private:
    Object* mObjectPtr;
};

これを使用する場合は、new で問題が発生した場合に備えて、エラー処理を追加する必要があります。

于 2013-02-25T21:33:42.453 に答える