从 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 年没有编写非托管代码了)但是我找不到问题所在。有什么想法吗?
编辑
我尝试了一些东西:
为我的持有人添加了一个 foo 成员:OK
试图在构造函数中定义该成员: 构造函数中出现异常
将 foo 成员推送到 addFoo 函数中的 foo 向量:OK
在 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 对象。不再有堆栈溢出,数据结构更符合逻辑。
我正在编写一个 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 年没有编写非托管代码了)但是我找不到问题所在。有什么想法吗?
编辑
我尝试了一些东西:
为我的持有人添加了一个 foo 成员:OK
试图在构造函数中定义该成员: 构造函数中出现异常
将 foo 成员推送到 addFoo 函数中的 foo 向量:OK
在 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 对象。不再有堆栈溢出,数据结构更符合逻辑。