Я пишу графический интерфейс c ++ / clr, чтобы обернуть некоторый неуправляемый код c ++, который пишу для целей тестирования.
Я использую прокси-класс с именем HolderOfUnmanagedStuff
, чтобы создать несколько неуправляемых объектов, которые мне нужны в моем clr gui.
#pragma once
#include "foo.h"
namespace fooCore
{
public class HolderOfUnmanagedStuff
{
public:
HolderOfUnmanagedStuff()
{
foos = std::vector<fooCore::foo>();
}
~HolderOfUnmanagedStuff() { }
public:
std::vector<fooCore::foo> foos;
void addFoo(std::string & fileName)
{
whatever code on the first line // <-- System.StackOverflowException
foo myfoo(FileName); // <--- when I comment those 2 lines no exception
foos.push_back(foo); // but exception when I comment only this one
}
otherUnmanagedMembers ...
};
}
Мой класс foo использует конструктор, который читает объект из файла:
#pragma once
namespace fooCore
{
class foo
{
public:
foo();
foo(std::string & fileName);
~foo();
fooMembers...
};
}
Всякий раз, когда я пытаюсь создать экземпляр класса foo, я получаю исключение Stack OverFlow с разрывом в первой строке функции.
Стек вызовов показывает только логическую иерархию вызовов: событие кнопки, затем вызов функции addFoo, и это все
Я перепробовал несколько решений, переписал каждый конструктор, проверил наличие неуправляемых / управляемых конфликтов, указателей, адресов, ссылок.
Я многому научился (очевидно, поскольку я не писал неуправляемый код в течение 15 лет), но не могу найти проблему. Есть идеи?
РЕДАКТИРОВАТЬ
Я попробовал несколько вещей:
добавил пользователя foo в мой держатель: OK
пытается определить этот элемент в конструкторе: исключение в конструкторе
нажатие элемента foo на вектор foo в функции addFoo: OK
определение элемента foo в addFoo: исключение
Следующий код показывает 4 теста, которые я сделал:
public class HolderOfUnmanagedStuff
{
public:
HolderOfUnmanagedStuff()
{
...
memberFoo = foo(); // TEST 2 : SOF exception on the first line of the constructor
}
~HolderOfUnmanagedStuff() { }
public:
foo memberFoo; // TEST 1 : No exception with that line
std::vector<fooCore::foo> foos;
void addFoo(std::string & fileName)
{
...
foos.push_back(memberFoo); // TEST 3 No exception with that line
memberFoo = foo(); // TEST 4 SOF on the first line of the function
}
otherUnmanagedMembers ...
};