LINUX.ORG.RU

Ответ на: комментарий от user_id_68054

спроси у clang, почему после обновления clang на 0.001 версию он оказался виртуальным, я не знаю

missxu
() автор топика
Ответ на: комментарий от missxu

Linux support is extremely experimental and presently incomplete.
The build script uses LLVM/Clang 3.8

Незачем спешить.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

Учитывая что у авторов target - MSVS, то ничего кроме говнокода там быть не может.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

ну сори, код в котором отваливаются std::unique_ptr я вижу первый раз в жизни, шокирован возможностями clang

missxu
() автор топика
Ответ на: комментарий от missxu

У них target - MSVS. Удивительно что оно вообще работало. Последний проект, который был написан чисто под MSVS у меня даже GCC не собирал.

RazrFalcon ★★★★★
()

а почему это ошибка? у меня на такое выдает обычный ворнинг. не всегда этот виртуальный деструктор нужен, т.е. практика-то хорошая, полезная, но не обязательная.

anonymous
()
Ответ на: комментарий от RazrFalcon

Последний проект, который был написан чисто под MSVS у меня даже GCC не собирал.

ты аккуратнее, а то щас понабежит толпа верующих в «кроссплатформенный С++»

missxu
() автор топика
Ответ на: комментарий от anonymous

Ваще он справедливо это в ошибку кидает. Если в абстрактном классе нет виртуального деструктора то этого говно, а не код.

anonymous
()
Ответ на: комментарий от anonymous

Если в абстрактном классе нет виртуального деструктора то этого говно, а не код.

прошу заметить - валидное говно, а раз так - то ошибкой считаться не может

anonymous
()

А что, собственно, не так?

http://eel.is/c++draft/expr.delete#3.sentence-1

In a single-object delete expression, if the static type of the object to be deleted is different from its dynamic type and the selected deallocation function (see below) is not a destroying operator delete, the static type shall be a base class of the dynamic type of the object to be deleted and the static type shall have a virtual destructor or the behavior is undefined.

utf8nowhere ★★★
()
Ответ на: комментарий от anonymous

так он и говорит, что деструктора нет совсем.

that is abstract but has non-virtual destructor

у базового абстрактного класса.

anonymous
()
Ответ на: комментарий от missxu

Так там не ISO C++, а Visual C++. Последний не кроссплатформенен по определению.

anonymous
()

можно ведь абстрактные классы использовать для определения интерфейса, а полиморфизм вообще не юзать

anonymous
()
Ответ на: комментарий от anonymous

Как нет? has, но только non-virtual, т.е. обычный деструктор

anonymous
()
Ответ на: комментарий от anonymous
struct test {
    ~test() = default;
    virtual void call() = 0;
};

struct base : public test {
    base()
        :blabla(10000, '1')
    {
    }

    void call() override
    {
    }
    std::string blabla;
};

std::unique_ptr<test> create()
{
    return std::unique_ptr<test>(new base);
}

int main()
{
    auto b = create();
    return 0;
}

Собссно вот минимальное воспроизведение того фекаля, который там. Но gcc об этом молчит, кста, что скорее плохо, чем хорошо, а вот clang честно говорит, что тут фекаль, правда варнингом.

anonymous
()
Ответ на: комментарий от anonymous

а, кстати. вот что тут не так:

==16146==   total heap usage: 3 allocs, 2 frees, 82,745 bytes allocated
==16146== 
==16146== LEAK SUMMARY:
==16146==    definitely lost: 10,001 bytes in 1 blocks
==16146==    indirectly lost: 0 bytes in 0 blocks
==16146==      possibly lost: 0 bytes in 0 blocks
==16146==    still reachable: 0 bytes in 0 blocks
==16146==         suppressed: 0 bytes in 0 blocks
==16146== Rerun with --leak-check=full to see details of leaked memory

теперь делаем virtual ~test() = default; и вуяаля

==16204== HEAP SUMMARY:
==16204==     in use at exit: 0 bytes in 0 blocks
==16204==   total heap usage: 3 allocs, 3 frees, 82,745 bytes allocated
==16204== 
==16204== All heap blocks were freed -- no leaks are possible

anonymous
()

Это будет со всеми, кто не делает виртуальным деструктор у абстрактного класса. Но для специально для таких, как ты, есть флажок -Wno-delete-non-virtual-dtor.

Laz ★★★★★
()
Ответ на: комментарий от anonymous

Присмотрись, там включён -Werror.

Laz ★★★★★
()
Ответ на: комментарий от anonymous

а чойто «behavior is undefined»? вполне себе дефайнед. будет вызван деструктор базового класса.

Компилятор (оптимизатор) резко и дерзко полагается на UB, а точнее на то, что программист умный и знает что делает (а всмысле не делает UB). По этому вызов коструктора базового класса — это только цветочки, из того, что тут может быть.

KennyMinigun ★★★★★
()

Цепепе же. Чего ты хотел. Другого не дано.

azelipupenko
()
Ответ на: Rust от anonymous

в rust возможны точно такие же утечки памяти, как в этом коде на крестах. Не веришь - погугли про mem::forget

anonymous
()
Ответ на: комментарий от anonymous

Только в данном случае в Rust тебе нужно явно написать mem::forget(value);, что по сути и означает, что код на Rust заниматься освобождением этого куска памяти не будет, а в C++ тебе нужно просто забыть о виртуальном деструкторе в абстрактном классе (а некоторым даже забывать не надо, ибо они не понимают что он тут нужен).

Nexmean
()

зачем вы взяли в руки компилятор если вы им пользоваться не умеете?
для таких как вы придумали готовые пакеты вашего говно софта типа эмуляторов и прочего, ставьте готовое либо пишите жалобы тем кто должен ваше говно поддерживать в обновленном состоянии
а то по набегает школоты у которых make выдает ошибку и ноют на каждом углу

anonymous
()
Ответ на: комментарий от anonymous

Вангую что это говнокот
that is abstract but has non-virtual destructor [however, still public]

Даже ванговать не надо

Deleted
()

То есть ты жалуешься что новый кланг явно указал на проблему в твоём говнокоде?

slovazap ★★★★★
()
Ответ на: комментарий от Deleted

даже удаление через базовый тип тянет максимум на предупреждение. ничего страшного не произойдет, если в классах-потомках определены только новые методы и/или типы, им вообще вызов деструктора нафиг не нужен.

anonymous
()
Ответ на: комментарий от anonymous

Там и есть предупреждение. ТС включил -Werror, так как мазохист.

anonymous
()
Ответ на: комментарий от anonymous

Удаление объекта через базовый тип невиртуальным деструктором - UB. Это как-бы не синоним фразы «ничего страшного»

Deleted
()
Ответ на: комментарий от Deleted

В том-то и дело, что не UB. Поведение вполне определенное - деструкторы классов потомков вызваны не будут. Только не надо ссылаться на стандарт - там херня написана.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.