почему скалярный деструктор удаления вызывается в результате удаления вектора в Windows?

У меня утечка кода в Windows. Он отлично работает на многих платформах unix, и утечка происходит только в Windows. Бинарный файл состоит из exe, 1 dll и 2 статических библиотек. EXE связывается как с dll, так и со статическими библиотеками, а статические библиотеки также связаны с dll. Утечка происходит в коде exe, когда вместо вызова деструктора удаления вектора по какой-то причине вызывается скалярный деструктор удаления. В результате удаляется только первый объект в массиве, а остальная часть массива остается в памяти.

Утечка псевдокода выглядит следующим образом:

class MyClassFromExe : public MyBaseClassFromDll {
  public:
    ClassFromDll* m_arr;

    MyClassFromExe(unsigned int size)  
    {
      m_arr = new ClassFromDll[size];
    }

    ~MyClassFromExe() 
    {
      delete [] m_arr;
    }
};

void func()
{
  MyClassFromExe obj(3);
}

Когда функция func () завершается и вызывается деструктор, я вижу что вызывается только деструктор первого объекта в m_arr. Из отладчика я вижу, что это делается из скалярного деструктора удаления, а не из деструктора удаления вектора. Это объясняет, почему уничтожается только первый объект. Мне нужно понять, почему при использовании delete [] вызывается скалярный деструктор удаления ???

Я нашел этот поток - Почему вызывается деструктор удаления вектора в результате скалярного удаления? . Я последовал приведенным там предложениям и убедился, что все модули скомпилированы с помощью /MD.[12208pting. Важно отметить, что когда dll, содержащая ClassFromDll, была статической библиотекой, а не dll, все работало нормально. Утечка началась только тогда, когда статическая библиотека была изменена на dll. В то время как утечка программы происходит в режиме выпуска, она вылетает в режиме отладки при удалении [] m_arr. Сбой происходит в строке 52 dbgdel.cpp - _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse).

На платформах unix эта библиотека также является совместно используемой библиотекой, и, как и ожидалось, там вызывается деструктор удаления вектора, и утечки нет. Может быть проблема в компиляторе VC? А может быть нужно изменить какие-то другие настройки проектов? и никаких специальных опций. Я не понимаю, для чего предназначен элемент адреса цитаты Mage_Sales_Model_Quote_Address_Item - сопоставлен с таблицей db sales_flat_quote_address_item). Я вижу, что с ним связан адрес, но какого черта это нужно? Я могу представить, что это может иметь какое-то отношение к многоадресной доставке (которую я никогда не использовал), но это дикая догадка.

В качестве второстепенного вопроса (на самом деле вся причина этого вопроса: /): есть ли случаи, когда пользовательский модуль, работающий с элементами цитаты, мог бы безопасно игнорировать элемент адреса цитаты?

10
задан Community 23 May 2017 в 12:30
поделиться