Существуют ли обстоятельства, при которых неуправляемая структура может вызывать деструктор управляемого класса, содержащий ее? - PullRequest
0 голосов
/ 28 апреля 2018

Мне трудно понять, как сформулировать мою ошибку, а также как она может на самом деле произойти.

Чтобы сократить большую головную боль, я обновляю устаревшее приложение C ++ MFC до C ++ / CLI, и для этого требуется преобразовать некоторые неуправляемые классы в управляемые классы. В некоторых ситуациях существует класс, который содержит 12 различных неуправляемых структур и одну управляемую структуру, поэтому я пытаюсь использовать шаблон Embedded, как описано в следующем сообщении в блоге разработчика: https://blogs.msdn.microsoft.com/branbray/2005/07/20/some-notes-about-mixed-types/

Используемый мной встроенный класс выглядит следующим образом:

template <typename T>
   ref class Embedded {
      T* t;
   public:
      !Embedded() {
         if (t != nullptr) {
            delete t;
            t = nullptr;
         }
      }

      ~Embedded() {
         this->!Embedded();
      }

      Embedded() : t(new T) {}

      static T& operator&(Embedded% e) { return (*e.t); }
      T* operator->() { return t; }
   };

Класс, вызывающий у меня проблемы, следующий:

ref struct Instance_t
{
   bool                                   Remote;
   uint32_t                               ID;
   UDPSocketMgr_t                         ^SockMgr;
   Embedded<MsgCounts_t>                  MsgCounts;
   Embedded<Connection_t>                 Connection;
   Embedded<PendingMsgFlags_t>            PendingMsgFlags;
   bool                                   SendPendingMsgs;
   Embedded<PROCESS_INFORMATION>          ProcInfo;

   // these copies of messages will be sent to new instances as the start up
   Embedded<RDI::PlatformAttributesMsg_t> PlatformAttributesMsg;
   Embedded<RDI::PoiFileMsg_t>            PoiFileMsg;
   Embedded<RDI::CommonControlsMsg_t>     CommonControlsMsg;
   Embedded<RTDI::ControlsMsg_t>          ControlsMsg;
   Embedded<RTDI::FlightPlanMsg_t>        FlightPlanMsg;

   Embedded<MessageManager_t> PaMsgMgr;
   Embedded<MessageManager_t> PoiFileMsgMgr;
   Embedded<MessageManager_t> CommonControlsMsgMgr;
   Embedded<MessageManager_t> ControlsMsgMgr;
   Embedded<MessageManager_t> SectorMsgMgr;
   Embedded<MessageManager_t> PolarPolyMsgMgr;
   Embedded<MessageManager_t> GeoPolyMsgMgr;
   Embedded<MessageManager_t> GeoPatchMsgMgr;
   Embedded<MessageManager_t> FlightPlanMsgMgr;
   Embedded<MessageManager_t> PoiListMsgMgr;
   Embedded<AckedMessages_t> AckedMsgs;
};

Когда я пытаюсь скомпилировать код, я получаю сообщение:

'AckedMessages_t': класс не имеет финализатора с именем '! Embedded'

Ради любопытства я создал отдельный тип данных и поместил его в структуру instance_t, что привело к смещению сообщения об ошибке:

'MessageManager_t': у класса нет финализатора с именем! Embedded '

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

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

Есть что-то очевидное, что я упускаю? Кто-нибудь когда-нибудь видел что-то подобное раньше? Любая помощь крайне необходима.

...