Сообщение Баг или фитча? от 05.09.2019 11:07
Изменено 05.09.2019 11:16 nen777w
Баг или фитча?
Добрый час.
Проблема в том что при выборосе исключения:
В деструкторе Object происходит AV (Windows — cl) или Seg.Fault (Linux — gcc)
Вот такое изменение:
Исправляет проблему с падением, но приводит к двойному вызову деструктора ~Object() (конструктор вызывается 1 раз)
Мне не очень понятно зачем здесь виртуальное наследование, и правы ли компиляторы?
Другой пример:
Уже не приводит к seg. fault у gcc, но приводит к AV у cl (при запуске исполняемого файла).
Замена = default на обычную имплементацию "по старинке" решает проблему с cl.
"Есть такой код." | |
| |
Проблема в том что при выборосе исключения:
IntermObject(int v)
: IntermObject()
{
throw "uups";
}
В деструкторе Object происходит AV (Windows — cl) или Seg.Fault (Linux — gcc)
"Из за неправильного смещения:" | |
Вот такое изменение:
class PageTreeNode final : public IntermObject, public virtual IPageTreeNode
Исправляет проблему с падением, но приводит к двойному вызову деструктора ~Object() (конструктор вызывается 1 раз)
Мне не очень понятно зачем здесь виртуальное наследование, и правы ли компиляторы?
Другой пример:
struct Object
{
Object() = default;
virtual ~Object() = default;
};
struct IntermObject : public virtual Object
{
IntermObject() = default;
IntermObject(int v) : IntermObject() {}
};
struct PageTreeNode : public IntermObject
{
PageTreeNode() : IntermObject(1) {}
};
int main()
{
new PageTreeNode();
}
Уже не приводит к seg. fault у gcc, но приводит к AV у cl (при запуске исполняемого файла).
Замена = default на обычную имплементацию "по старинке" решает проблему с cl.
Баг или фитча?
Добрый час.
Проблема в том что при выборосе исключения:
В деструкторе Object происходит AV (Windows — cl) или Seg.Fault (Linux — gcc)
Вот такое изменение:
Исправляет проблему с падением, но приводит к двойному вызову деструктора ~Object() (конструктор вызывается 1 раз)
Мне не очень понятно зачем здесь виртуальное наследование, и правы ли компиляторы?
Другой пример:
Уже не приводит к seg. fault у gcc, но приводит к AV у cl (при запуске исполняемого файла).
Замена = default на обычную имплементацию "по старинке" решает проблему с cl.
cl.exe — Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27031.1
gcc — из https://www.onlinegdb.com
"Есть такой код." | |
| |
Проблема в том что при выборосе исключения:
IntermObject(int v)
: IntermObject()
{
throw "uups";
}
В деструкторе Object происходит AV (Windows — cl) или Seg.Fault (Linux — gcc)
"Из за неправильного смещения:" | |
Вот такое изменение:
class PageTreeNode final : public IntermObject, public virtual IPageTreeNode
Исправляет проблему с падением, но приводит к двойному вызову деструктора ~Object() (конструктор вызывается 1 раз)
Мне не очень понятно зачем здесь виртуальное наследование, и правы ли компиляторы?
Другой пример:
struct Object
{
Object() = default;
virtual ~Object() = default;
};
struct IntermObject : public virtual Object
{
IntermObject() = default;
IntermObject(int v) : IntermObject() {}
};
struct PageTreeNode : public IntermObject
{
PageTreeNode() : IntermObject(1) {}
};
int main()
{
new PageTreeNode();
}
Уже не приводит к seg. fault у gcc, но приводит к AV у cl (при запуске исполняемого файла).
Замена = default на обычную имплементацию "по старинке" решает проблему с cl.
cl.exe — Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27031.1
gcc — из https://www.onlinegdb.com