Сегодня во время обсуждения один из коллег сказал мне, что имеет значение, если в исходном файле вместо заголовочного файла определен дефолтный деструктор. Я не могу вспомнить подробности разговора (в основном потому, что я не мог следовать его аргументации), но он сказал что-то вроде:
Если значение 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 по умолчанию встроен по сравнению сисходный файл?