Сбои и утечки с std :: auto_ptr, несмотря на полный тип в деструкторе

Я читаю 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 эффективно, секция Обтекание членов данных указателя имеет дело с этим. Проблемы, которые я описываю выше, поэтому являются очень запутанным опытом.


  • [1] Этот пример сокращен, чтобы обсудить формальную структуру использования auto_ptr.
  • [2] Borland C ++ 5.6.4 и STL, поставляемый с C ++ — Builder 6 (upd4)

2

Решение

Будет проще исправить код для компиляции на более новом компиляторе с unique_ptr поддержка, чем исправить auto_ptr (Как вы думаете, почему Комитет по Стандартам убил его полностью? Потому что они сочли это неустранимым).

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector