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