3

自動ポインタは、スコープ外になると、それが指すオブジェクトに対して内部的にdeleteを呼び出します。これは、ヒープ上に作成されたオブジェクトを割り当てる場合に正常に機能します。しかし、ヒープ上に作成されていないオブジェクトを割り当てようとすると、deleteが2回呼び出されるため、クラッシュします。最初にauto_ptr自体によって、次にオブジェクトがスコープ外になると、そのデストラクタが再度呼び出されます。以下に示すように、

#include <iostream>
#include <memory>

using namespace std;

class sample
{
      public:
             sample() { puts("sample"); }
             ~sample() { puts("~sample"); }
};

int main()
{
    sample sObj;
    auto_ptr<sample> samplePtr(&sObj);
}

これは、auto_ptrを使用して、ヒープ上に作成されたオブジェクトのみを保持できることを意味しますか?

4

5 に答える 5

3

はい、正確には、auto_ptrヒープに割り当てられたオブジェクトにのみ使用できます。技術的な理由は、auto_ptrデストラクタの呼び出しdeleteでありdelete、ヒープに割り当てられていないオブジェクトの呼び出しは未定義の動作であり、ヒープをクラッシュさせたり、デストラクタを複数回実行したりする可能性があります。

于 2012-05-16T11:43:28.140 に答える
2

簡単な答え-はい。

これは、メモリを管理する責任をに渡すことを意味しますauto_ptr。ただし、自動ストレージでオブジェクトを作成する場合、その責任はランタイムにあるため、譲渡するのはあなたの責任ではありません。

于 2012-05-16T11:42:54.830 に答える
2

自動保存期間のオブジェクト(「スタック上」と呼ばれるもの)は自動的にクリーンアップされます。auto_ptrで割り当てられたオブジェクトのクリーンアップを容易にするために存在します(ポインタnewを呼び出します)。自動保存期間のオブジェクトはに割り当てられていないため、これらのオブジェクトでdelete使用することは意味がありません。auto_ptrnew

于 2012-05-16T11:43:16.067 に答える
2

std::auto_ptr を使用すると、ヒープ上に作成されたオブジェクトのみを保持できます。

ただし、たとえば boost::shared_ptr を使用すると、オブジェクトがスコープを離れたときに呼び出されるデリータを指定できます。そのため、スタック上のオブジェクトを参照する場合、実際には何もしないカスタム デリーターを使用できます。
詳細については、 boost::shared_ptrを参照してください

std::auto_ptr は C++11 以降非推奨C++11 std::auto_ptr 非
推奨 を参照

于 2012-05-16T11:52:28.280 に答える
1

auto_ptrこれは、ヒープ上に作成されたオブジェクトのみを保持するために使用できることを意味しますか?
はい。
自動オブジェクトは自動的に破棄されるため、スマートポインターのようなラッパーは必要ありません。

ただし、を使用できる、shared_ptrまたはunique_ptrカスタム削除関数を呼び出す機能を提供することに注意してください。newこのカスタム削除機能を使用する代わりに、カスタムメモリアロケータを使用できます。

auto_ptrは非推奨であり、C++標準がunique_ptr優れた代替手段であることを示唆しています。

于 2012-05-16T11:43:33.443 に答える