Вектор в какой-то момент становится не пустым, хотя его не трогают
Вводные:
Создаю DLL. Проверяю эту DLL в своей же другой программе-тесте. В DLL создаётся класс "ExCompRegularExp" (наследник класса "AddInNative"). Классу "AddInNative" принадлежит класс "Method"
class AddInNative : public IComponentBase {
private:
class ObjectAddIn {
protected:
string1C name;
string1C nameRU;
public:
ObjectAddIn(string1C newName, string1C newNameRU);
string1C GetName();
string1C GetNameRU();
};
class Prop : public ObjectAddIn {
private:
std::function<value1C()> getter;
std::function<void(value1C*)> setter;
public:
Prop(string1C newName, string1C newNameRU, std::function<value1C()> newGetter, std::function<void(value1C*)> newSetter);
bool isReadable();
bool isWritable();
value1C ExecuteGet();
void ExecuteSet(value1C* value);
};
class Method : public ObjectAddIn {
private:
bool returnsValue = false;
long numParams = 0;
std::map<long, value1C> defaultParams;
std::function<value1C(value1C* params, long sizeParams)> func;
public:
Method(string1C newName, string1C newNameRU, bool hasReturnValue, long numberParams, std::function<value1C(value1C*, long)> executeFunc);
bool HasReturnValue();
long GetNumParams();
value1C* GetDefaultParam(long key);
value1C Execute(value1C* params, long sizeParams);
};
std::vector<Prop> props{};
std::vector<Method> methods{};
В классе "AddInNative" есть поля "props"/"methods" типа "vector" с типом содержимого классов "Prop" и "Method" соответственно. Также есть метод "Init". Методы класса я вызываю через лямбда функции в своей программе-тесте, например вот так:
auto lambda = [&p_Comp = p_Component1C, &p_Platform1C, &result]() {
result = p_Comp->Init(p_Platform1C);
};
Переменная "p_Component1C" содержит в себе указатель на класс "ExCompRegularExp", который наследуется от "AddInNative". При вызове метода отладка заходит в метод "Init", всё хорошо
Проблема: При попадании в метод класса "Init" и при выполнении этой строки...
p_iMsgBox = (IMsgBox*)p_iPlatform->GetInterface(Interfaces::eIMsgBox);
...вываливается ошибка удаления элементов из вектора "methods" с ошибкой "Вызвано необработанное исключение: нарушение доступа для чтения. _Parent_proxy было 0xFDFDFDFD."
bool AddInNative::Init(void* p_Interface1C) {
p_iPlatform = (IAddInDefBaseEx*)p_Interface1C;
if (!p_iPlatform)
return false;
p_iMsgBox = (IMsgBox*)p_iPlatform->GetInterface(Interfaces::eIMsgBox);
Стек вызовов:
std::_Iterator_base12::_Adopt(const std::_Container_base12 * _Parent)
std::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>>,std::_Iterator_base12>::_Tree_unchecked_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>>,std::_Iterator_base12>(std::_Tree_node<std::pair<long const ,_tVariant>,void *> * _Pnode, const std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>> * _Plist)
std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>>>::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>>>(std::_Tree_node<std::pair<long const ,_tVariant>,void *> * _Pnode, const std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>> * _Plist)
std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>>>::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>>>(std::_Tree_node<std::pair<long const ,_tVariant>,void *> * _Pnode, const std::_Tree_val<std::_Tree_simple_types<std::pair<long const ,_tVariant>>> * _Plist)
std::_Tree<std::_Tmap_traits<long,_tVariant,std::less<long>,std::allocator<std::pair<long const ,_tVariant>>,0>>::end()
std::_Tree<std::_Tmap_traits<long,_tVariant,std::less<long>,std::allocator<std::pair<long const ,_tVariant>>,0>>::_Tidy()
std::_Tree<std::_Tmap_traits<long,_tVariant,std::less<long>,std::allocator<std::pair<long const ,_tVariant>>,0>>::~_Tree<std::_Tmap_traits<long,_tVariant,std::less<long>,std::allocator<std::pair<long const ,_tVariant>>,0>>()
std::map<long,_tVariant,std::less<long>,std::allocator<std::pair<long const ,_tVariant>>>::~map<long,_tVariant,std::less<long>,std::allocator<std::pair<long const ,_tVariant>>>()
AddInNative::Method::~Method()
AddInNative::Method::`scalar deleting destructor'(unsigned int)
std::_Default_allocator_traits<std::allocator<AddInNative::Method>>::destroy<AddInNative::Method>(std::allocator<AddInNative::Method> & __formal, AddInNative::Method * const _Ptr)
std::_Destroy_range1<std::allocator<AddInNative::Method>>(AddInNative::Method * _First, AddInNative::Method * _Last, std::allocator<AddInNative::Method> & _Al, std::integral_constant<bool,0> __formal)
std::_Destroy_range<std::allocator<AddInNative::Method>>(AddInNative::Method * _First, AddInNative::Method * _Last, std::allocator<AddInNative::Method> & _Al)
std::vector<AddInNative::Method,std::allocator<AddInNative::Method>>::_Destroy(AddInNative::Method * _First, AddInNative::Method * _Last)
std::vector<AddInNative::Method,std::allocator<AddInNative::Method>>::_Tidy()
std::vector<AddInNative::Method,std::allocator<AddInNative::Method>>::~vector<AddInNative::Method,std::allocator<AddInNative::Method>>()
AddInNative::~AddInNative()
ExCompRegularExp::~ExCompRegularExp()
ExCompRegularExp::`scalar deleting destructor'(unsigned int)
AddInNative::Init(void * p_Interface1C)
Я упорно не понимаю почему вызываются деструкторы классов, хотя сам класс ни в коем случае не удаляется ни через "delete", ни удалением объекта, ни как-то ещё. Но самое странное, что проверяя стек вызовов и проверяя всё подряд я наткнулся на то, что размер вектора "methods":
- Перед вызовом лямбды-функции - 0
- В лямбде-функции перед вызовом методом класса - 0
- В методе самого класса:
Я не понимаю почему так происходит и как вообще такое возможно. Что я делаю не так и может есть хоть какая-то идея в какую сторону копать? Или хотя бы как ещё можно что-то посмотреть. Собираю всё сам, все исходники есть. Запускаю версию Windows Debug x86. Собираю через CMake: Генератор "Visual Studio 17 2022", toolset "v141_xp"
Уже две недели бьюсь :с
Ответы (1 шт):
Проблема решена
Сборка производилась через bat-файлы + параметры (если нужно собрать) или через Visual Studio и пресеты. Они были одинаковые за исключением параметров (не стояли в пресете):
CMAKE_CXX_FLAGS="/utf-8"
CMAKE_C_FLAGS="/utf-8"
Всё было из-за кодировки исходных файлов -___- Это "великолепно", но очень интересно почему именно это так. В любом случае: надеюсь кому-то будет полезно