从 clr gui 实例化非托管 class 时引发 Stackoverflow 异常

Stackoverflow exception raised when instanciating an unmanaged class from a clr gui

我正在编写一个 c++/clr gui 来包装我为测试目的而编写的一些非托管 c++ 代码。

我使用一个名为 HolderOfUnmanagedStuff 的代理 class 来实例化我在 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.WhosebugException

            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 class 使用从文件中读取对象的构造函数:

#pragma once
namespace fooCore
{    
    class foo
    {
    public:
        foo();
        foo(std::string & fileName);
        ~foo();

         fooMembers...
    };
}

每当我尝试实例化 foo class 时,我都会收到 Stack OverFlow 异常,并在函数的第一行中断。

调用堆栈仅显示了逻辑调用层次结构:一个按钮事件,然后是对 addFoo 函数的调用,仅此而已

我尝试了多种解决方案,重写了每个构造函数,检查了 unmanaged/managed 冲突、指针、地址、引用。

我学到了很多东西(很明显,因为我已经 15 年没有编写非托管代码了)但是我找不到问题所在。有什么想法吗?

编辑

我尝试了一些东西:

  1. 为我的持有人添加了一个 foo 成员:OK

  2. 试图在构造函数中定义该成员: 构造函数中出现异常

  3. 将 foo 成员推送到 addFoo 函数中的 foo 向量:OK

  4. 在 addFoo 中定义 foo 成员:异常

以下代码显示了我所做的 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 ...
    };

异常是因为我的 foo class 对于堆栈来说太大了。

我修改了我的代码,以便默认构造函数在数据段(堆上)中声明每个 foo 对象。不再有堆栈溢出,数据结构更符合逻辑。