Определение деструктора виртуального по умолчанию в исходном файле и в заголовочном файле - PullRequest
0 голосов
/ 09 ноября 2019

Сегодня во время обсуждения один из коллег сказал мне, что имеет значение, если в исходном файле вместо заголовочного файла определен дефолтный деструктор. Я не могу вспомнить подробности разговора (в основном потому, что я не мог следовать его аргументации), но он сказал что-то вроде:

Если значение dtor по умолчанию в заголовочном файле, интеллектуальные указатели могут потенциально вызывать неправильные слова. dtor. Это как-то связано с предварительным объявлением типа, который удерживаются интеллектуальными указателями, границами dll и тем фактом, что встроенные по умолчанию dtors в заголовках являются встроенными.

Допустим, у нас есть базовый тип и производный тип, которыйчасть API некоторой dll.

Base.hpp

struct Base
{
    virtual ~Base() = default;
};

Derived.hpp

#define DLL_API __declspec(dllexport) 

struct Derived : Base
{
    // some arbitrary content

    DLL_API Derived();
    DLL_API virtual ~Derived() = default; // (1)
};

Если бы я использовал Derived любым способом,внутри или вне dll, будет ли иметь значение, если dtor в (1) встроен по умолчанию (как в коде выше) или если он установлен по умолчанию в исходном файле, как ниже?

Derived.hpp

#define DLL_API __declspec(dllexport) 

struct Derived : Base
{
    // some arbitrary content

    DLL_API Derived();
    DLL_API virtual ~Derived();
};

Derived.cpp

Derived::~Derived() = default;

Существует ли сценарий, в котором поведение Derived отличается, если dtor по умолчанию встроен по сравнению сисходный файл?

1 Ответ

0 голосов
/ 09 ноября 2019

Явно установленный по умолчанию деструктор - constexpr (если возможно) в C ++ 20. Это единственное существенное различие в языке;это также inline, но это не должно иметь значения.

...