Удаление указателя на неполный тип и интеллектуальных указателей

При попытке использовать auto_ptr с типом, который был объявлен с помощью прямого объявления, например:

class A;
...
std::auto_ptr<A> a;

деструктор A не вызывается (очевидно, потому что auto_ptr внутренне удаляет базовый указатель и деструктор для неполного типа не может быть вызван).

Однако, тот же код работает нормально, и деструктор вызывается при использовании std :: shared_ptr вместо std :: auto_ptr .

package javax.swing.text;

public class Foo {
    public static void main(String[] args) {
        Object o = new Object();
        if (o instanceof Outer.Inner) {
            System.out.println("yay");
        } else {
            System.out.println("aww");
        }
    }
}

файл Outer.java :

package javax.swing.text;

public class Outer {
    class Inner {
    }
}

Это работает нормально и печатает «aww», как ожидалось.

Обратите внимание, что оба файла находятся в пакете javax.swing.text . Также обратите внимание, что Foo.java уже был в пакете javax.swing.text в моем исходном вопросе.

Насколько я могу судить, пакет не «запечатан». МАНИФЕСТ rt.jar (тот, который содержит пакет javax.swing.text ) не содержит "Sealed". Команда Package.getPackage ("javax.swing.text"). IsSealed () возвращает false.

Таким образом, я могу экземпляр против моего собственного внутреннего класса, но не против AbstractDocument.UndoRedoDocumentEvent , хотя другие классы из пакета могут.

Есть идеи, почему это так?

5
задан lesmana 27 May 2011 в 15:21
поделиться