Re: Операторы преобразования в std::auto_ptr
От: abrarov Россия http://asio-samples.blogspot.com/
Дата: 06.08.11 11:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Объясните пожалуйста, почему вот этот код не работает:


А>
А>#include <memory>

А>struct A {};
А>struct B : A {};

А>std::auto_ptr<B> foo()
А>{
А>    return std::auto_ptr<B>(new B);
А>}

А>int main()
А>{
А>    std::auto_ptr<A> p = foo();
А>}
А>


А>В случае, когда везде В или А, или, если добавить "(std::auto_ptr<A>)", то все нормально.


Не понятно, что означает "не работает" (MSVC 10.0 — собирается и даже без warning-ов)?
Что сразу заметно: std::auto_ptr<A> должен удалять объект, на который он указывает, посредством вызова деструктора ~A(). Но так как этот деструктор невиртуальный, и реально p указывает на экземпляр B, то имеет место ошибка — при уничтожении p вместо вызова деструктора ~B() будет вызван ~A() (и только).
Programs must be written for people to read, and only incidentally for machines to execute
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.