Удалить выражение - PullRequest
       10

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

3 голосов
/ 18 октября 2010

Ссылка здесь

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

Мой вопрос заключается в том, почему такая программа не существуеткоторый пытается удалить указатель на неполный тип, считающийся некорректным?Почему он выдвигается в область условного ( и полного класса имеет нетривиальный деструктор ..) 'неопределенное поведение'?

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

РЕДАКТИРОВАТЬ 2:

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

#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;
}

1 Ответ

5 голосов
/ 18 октября 2010

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

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

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

Приветствия & hth.,

...