Я читаю C ++: auto_ptr + прямое объявление? и его ответы, особенно принят один и я знаю о подводных камнях при комбинировании объявленных классов auto_ptr и forward. Но я сталкиваюсь с проблемами во время выполнения с этим же шаблоном, который, кажется, не покрывается этим Q&А (и все остальные Вопросы с тегами 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]?
Дополнительное замечание Я ожидал, что использование auto_ptr для незавершенных типов будет безопасным, прочитав статью Херба Саттера Использование auto_ptr эффективно, секция Обтекание членов данных указателя имеет дело с этим. Проблемы, которые я описываю выше, поэтому являются очень запутанным опытом.
Будет проще исправить код для компиляции на более новом компиляторе с unique_ptr
поддержка, чем исправить auto_ptr
(Как вы думаете, почему Комитет по Стандартам убил его полностью? Потому что они сочли это неустранимым).