2010-10-18 1 views
3

Reference hereУдалить выражение

что деструктор будет неявно вызов деструктор auto_ptr объекта. И это удалит указатель , который он удерживает, что указывает на объект C - не зная определения C! Это появилось в файле .cpp, где определен конструктор структуры A .

Это было любопытно, а затем

5.3.5/5 состояний - «Если объект удаляется имеет неполный тип класса в точку удаления и полный класс имеет нетривиальный деструктор или функция деаллоляции, поведение не определено. "

Вопрос в том, почему не такая программа, которая пытается удалить указатель на неполный тип, обработанный как плохо сформированный? Почему он вталкивается в область условных (и, полный класс имеет нетривиальный деструктор ..) «неопределенное поведение»?

Что означают «и»?

EDIT 2:

ли код ниже хорошо сформирован? VS и Gcc/CLang компилируются, но Комо дает предупреждение. Я думаю, все это является частью неопределенного поведения, упомянутого в стандарте. Мой вопрос: «Почему это не плохо сформировано, но не определено»?

#include <iostream> 
#include <memory> 
using namespace std; 

struct C; 
         // Is this the POI for auto_ptr<C>? $14.6.4.1/3 
struct A{ 
    A(); 
    auto_ptr<C> mc; 
    ~A(){}    // how does it link to C::~C at this point? 
}; 

struct C{}; 

A::A():mc(new C){} 

int main(){ 
    A a; 
} 

ответ

5

Как я пишу это, ваш текст говорит «Ссылка [здесь] [1]» без ссылки.

Но по существу стандарт позволяет использовать delete указатель на неполный тип, чтобы вы могли использовать знания, которых не имеет компилятор, а именно, что деструктор типа ничего не делает.

std::auto_ptr является примером, где это является проблемой, особенно для Pimpl идиомы (печально известный пример получения его неправильно было GOTW Герба Саттера на Pimpl, где он неправильно используется std::auto_ptr). boost::shared_ptr - пример, где это не проблема (вообще). Это потому, что конструктор boost::shared_ptr хранит функцию деаэратора, и полный тип указателя обязательно должен быть известен в точке построения.

Cheers & hth.,

+0

Да. Это было мое мнение. Обновлено – Chubsdad

+0

+1, интересно. Случается ли это на самом деле, что необходимо удалить тип POD без определения? Не являются ли классы с тривиальными деструкторами наименее вероятными, чтобы они остались неполными? Hmfph. – Potatoswatter

+0

можете ли вы указать ссылку на статью/материал, который вы упомянули в gotw? – Chubsdad

Смежные вопросы