なぜ/なで使える"新しい"オペレーターインスタンスを生成するクラスは、なぜですか?

StackOverflow https://stackoverflow.com/questions/572255

  •  05-09-2019
  •  | 
  •  

質問

私の理解できるものと解釈されるものは"お好み"問題がんを知りたいんだ、以下のいずれかの方法に。

例えば、皆さんがた スーパー複合体 クラスなど


class CDoSomthing {

    public:
        CDoSomthing::CDoSomthing(char *sUserName, char *sPassword)
        {
            //Do somthing...
        }

        CDoSomthing::~CDoSomthing()
        {
            //Do somthing...
        }
};

いつ、どのように宣言し、現地のインスタンス内のグローバル機能しているのでしょうか。


int main(void)
{
    CDoSomthing *pDoSomthing = new CDoSomthing("UserName", "Password");

    //Do somthing...

    delete pDoSomthing;
}

--または--


int main(void)
{
    CDoSomthing DoSomthing("UserName", "Password");

    //Do somthing...

    return 0;
}
役に立ちましたか?

解決

あなたは現在のブロックを超えて拡張するために、オブジェクトの有効期間を必要としない限り、

、ローカル変数を優先。 (ローカル変数は番目のオプションです)。これは、メモリ管理を心配するよりも、単に簡単です。

P.S。あなたが別の関数に渡すことが必要なので、あなたが、ポインタが必要な場合は、単にアドレス演算子を使用します:

SomeFunction(&DoSomthing);

他のヒント

あなたは、ヒープ内のスタック対上の変数を宣言するとき、

二つの主要な考慮事項があります - 。寿命制御およびリソース管理を

スタックに割り当て、オブジェクトの寿命にわたって厳密な制御を持っているときは本当によく働きます。それはあなたがポインタまたはローカル関数のスコープの外のコードに、そのオブジェクトの参照を渡すつもりはないことを意味します。これは、何のアウトパラメータ、無COM呼び出し、新しいスレッドを意味しません。制限のかなり多くが、あなたは、オブジェクトが現在のスコープからの正常または例外終了時に、あなたのために適切にクリーンアップを取得(ただし、あなたは仮想デストラクタを持つルールを巻き戻し、スタック上に読みたいかもしれません)。スタック割り当ての最大の欠点 - あなたはあなたがそれを置くものを注意する場合がありますので、スタックは通常、4Kや8Kに制限されています。

一方、ヒープ上に割り当てると、手動でクリーンアップにインスタンスを、あなたが必要となります。それはまた、あなたがインスタンスの存続期間を制御するために、どのように多くの自由を持っていることを意味します。あなたは、2つのシナリオでこれを行う必要があります。a)あなたは、スコープの外にそのオブジェクトを渡ししようとしています。またはb)オブジェクトが大きすぎるそれをスタックに割り当てることスタックオーバーフローを引き起こす可能性があります。

ところで、これら二つの間に素敵な妥協点は、ヒープ上のオブジェクトを割り当てると、スタック上でそれにスマートポインタを割り当てています。これは、まだスコープの終了時に自動クリーンアップを取得しているときに、貴重なスタックメモリを無駄にされていないことを保証します。

2番目の形式は、いわゆるRAIIパターン(リソースの取得は初期化されています)です。これは、最初に比べて多くの利点があります。

使用時のnew、あなた自身をdelete使用する必要があり、常に例外がスローされた場合でも、削除されることを保証します。あなたは自分のすべてを保証する必要があります。

変数がスコープの外に出たとき、あなたは二番目の形式を使用する場合は、

、それは常に自動的にクリーンアップされます。例外がスローされた場合や、スタックが巻き戻されると、それはまた、クリーンアップされます。

だから、あなたはRAII(2番目のオプションを)好む必要があります。

るもののほか、といわれているのはこれまでにもあり業績への配慮への取り下げ等を含むに関連して特にメモリ割当にアップグレード、新製品を受け:

  1. を使用 new ますからメモリを割り当てheap.この非常に頻繁)割り当てと解放に際してはよりお支払い高価格:
    • ロック:エディタで開き、ヒープがリソース共有すべてのスレッドにいます。操作のヒントが必要なロックのヒープ管ることができるようになりました用するライブラリ)が遅いものとなる。
    • 断片化:ヒープの姿です。あがり時間malloc/新しい無料/削除返還の増加は10倍となった。この化合物、ロッキング問題、そして、時間管理にあたって分断されたヒープ以上のスレッドのキューの最大の癒してロックが解除されます。(Windowsがフラグを設定でき、ヒープでheuristically軽減の試みの氾濫.)
  2. のrau-α(パターン記憶するだけで、スタックです。スタックは、スレッド単資源のないフラグメントは、ありませんロックの関与の可能性をご利用のメモリの産地(メモリキャッシュのCPUます。)

そのため、必要なオブジェクトを簡単に(またはscoped)の期間、利用目的、局所変数のスタックです。) が必要な場合は株当たりデータとスレッドを使用 new/malloc (一方で、秒針はこれらのオブジェクトは、通常、長寿命を十分でお支払いの本質的には0-コストに対するエディタで開き、ヒープマネージャ。)

例外がスローされた場合は、

番目のバージョンは、スタックをアンワインドします。最初はしません。私はそう大きな違いは表示されません。

両者の最大の違いは、新しいオブジェクトへのポインタを開始することです。

新しいずにオブジェクトを作成することにより、開始したオブジェクトがスタックに格納されています。それは新しいで開始されている場合は、ヒープ上に作成された新しいオブジェクトへのポインタを返します。これは、実際に新しいオブジェクトを指すメモリアドレスを返します。これが起こるとき、あなたはメモリに必要な変数を管理します。あなたは、変数を使用して行われている場合、あなたはメモリリークを避けるために、それを削除呼び出す必要があります。変数がスコープの外に出るときに、新しい演算子がなければ、メモリは自動的に解放されます。

は、使用して、現在のスコープの外で変数を渡す必要がある場合は、新しい、より効率的であるようにします。ただし、場合は、一時的な変数、またはあなたは、メモリ管理を心配する必要はありませんので、のみ、スタック上のオブジェクトが良いことになるだろう持つ、一時的に使用されるものを作成する必要があります。

マーク身代金は右である、また、あなたがのCreateThread風の関数へのパラメータとして変数を渡ししようとしている場合newでインスタンス化する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top