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