2

C++を読みました: auto_ptr + 前方宣言? とその答え、特に受け入れられたものと、auto_ptr と前方宣言されたクラスを組み合わせるときの落とし穴を認識しています。しかし、この Q&A (およびチェックした他のすべてのauto_ptr タグ付きの質問)でカバーされていないように見える同じパターンで実行時の問題が発生しています。

Outerのようなクラス[1]を破棄すると、アクセス違反が発生することがあります。

// Outer.h - an example header
#include <uncopyable.h>
#include <memory>
class Inner;

class Outer: private Uncopyable
{
public:
    Outer()
    ~Outer();
private:
    std::auto_ptr<Inner> inner;
};

cpp ファイルにコンストラクタとデストラクタを実装していますが、そこにInner型の定義が存在します。

// Outer.cpp - an example implementation
#include "Outer.h" //< I use this include order to ensure compileability
#include "Inner.h" //< for units including Outer.h without preconditions

Outer::Outer(): inner(new Inner) {}

Outer::~Outer() {}

説明されている問題は、次の場合に消えます。

  • またはInner.h内に含めるOuter.h
  • 明示的に呼び出すinner.reset()

私は C++-Builder 6 でのみコンパイルされるレガシー コードstd::auto_ptrに取り組んでおり、コンパイラがサポートしているように見える唯一の smart_ptr 実装であるため、これに固執する必要があります。 C++11 による)。

私の質問: ここで何が間違っているのでしょうか、それとも BCB6 [2]のよく知られたバグでしょうか?


追加の注意Herb Sutter の記事 Using auto_ptr Effectivelyを読んで、不完全な型で auto_ptr を使用しても安全だと思っていました。したがって、上で説明した問題は非常に紛らわしい経験です。


  • [1]この例は、auto_ptr 使用の正式な構造を説明するために省略されています。
  • [2] Borland C++ 5.6.4、および C++-Builder 6 (upd4) に同梱されている STL
4

1 に答える 1

2

unique_ptr修正するよりも、サポートのある新しいコンパイラでコンパイルするようにコードを修正する方が簡単ですauto_ptr(標準委員会がそれを完全に削除したのはなぜだと思いますか? 彼らはそれを修正できないと考えたからです)。

于 2014-06-19T15:31:16.367 に答える