【发布时间】:2017-05-27 19:39:54
【问题描述】:
出于我不想进入这里的原因,我必须将在其他地方编写的一些代码集成到我们的程序中,而对其代码的更改最少。该代码有一个构造函数,它创建一个结构作为局部变量(在堆栈上),然后将其分配给一个成员变量,如下所示:
struct S
{
// lots of real_T's and uint32_T's and structs and structs within structs
};
class C
{
private:
S s;
// among other members
};
C::C()
{
S tempS = {
// more than 52k lines of code!!!
};
s = tempS;
}
他们的代码是从某种 Matlab 模型自动生成的,是的,该结构的初始化程序中有超过 52,000 行代码。 由于明显的原因,它会导致堆栈溢出,这是我要解决的实际问题。
C 类正在堆上创建(实际上它是从 C 派生的类的包装器),我的理解是这意味着 C.s 也在堆上。
请注意,我们目前使用的是 Visual Studio 2010,但我们将很快迁移到 Visual Studio 2015(TM),因此适用于任何一种的解决方案都可以。
问题
有没有办法直接初始化C.s?
或者有没有一种方法可以在将 tempS 复制到 C.s 之前在堆上创建它,而无需重写 52k 行初始化程序代码?
这些方法似乎都不适合我:http://en.cppreference.com/w/cpp/language/value_initialization。
(6) 看起来像我想要的:
S * tempS = new S {
// more than 52k lines of code!!!
};
但它会导致编译错误:“error C2143: syntax error: missing ';'在'{'”之前
【问题讨论】:
-
发生了什么是你直接在成员初始化列表中初始化
s? -
一个结构中的 52k 行?哇。但是您可以将您的尝试
S * tempS = new S {...修改为S * tempS = new S;并使用S->var = ...初始化每个成员 -
那“超过 52k 行代码!!!”评论实际上把我吓坏了。代码有味道,有人吗?
-
我想您的另一个选择是增加程序的堆栈大小。
-
VS2010 已经过时,它可能理解也可能不理解
new S { ... }语法。移到 2015 年。
标签: c++ struct heap-memory stack-overflow