Вектор в какой-то момент становится не пустым, хотя его не трогают

Вводные:

Создаю 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":

  1. Перед вызовом лямбды-функции - 0
  2. В лямбде-функции перед вызовом методом класса - 0
  3. В методе самого класса:

Некорректный размер vector

Я не понимаю почему так происходит и как вообще такое возможно. Что я делаю не так и может есть хоть какая-то идея в какую сторону копать? Или хотя бы как ещё можно что-то посмотреть. Собираю всё сам, все исходники есть. Запускаю версию Windows Debug x86. Собираю через CMake: Генератор "Visual Studio 17 2022", toolset "v141_xp"

Уже две недели бьюсь :с


Ответы (1 шт):

Автор решения: Treaq

Проблема решена

Сборка производилась через bat-файлы + параметры (если нужно собрать) или через Visual Studio и пресеты. Они были одинаковые за исключением параметров (не стояли в пресете):

CMAKE_CXX_FLAGS="/utf-8"

CMAKE_C_FLAGS="/utf-8"

Всё было из-за кодировки исходных файлов -___- Это "великолепно", но очень интересно почему именно это так. В любом случае: надеюсь кому-то будет полезно

→ Ссылка