在堆上而不是堆栈上初始化C ++结构

时间:2017-01-12 15:54:13

标签: c++ struct heap stack-overflow

由于我不想进入这里的原因,我必须将其他地方编写的代码集成到我们的程序中,只需对代码进行最少的更改。代码有一个构造函数,它创建一个struct作为局部变量(在堆栈上),然后将它分配给一个成员变量,如下所示:

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),因此可以使用的解决方案都很好。

问题

  1. 有没有办法直接初始化C.?

  2. 或者有没有办法在堆上创建tempS,然后将其复制到C.s而不重写52k行的初始化代码?

  3. 这些方式似乎都不适合我:document

    (6)看起来像我想要的那样:

    S * tempS = new S {
        // more than 52k lines of code!!!
    };
    

    但是它会导致编译错误:"错误C2143:语法错误:缺少&#39 ;;'之前' {'"

3 个答案:

答案 0 :(得分:4)

  

有没有办法直接初始化C.s?

是的,只需替换此代码:

C::C()
{
   S tempS = {
      // more than 52k lines of code!!!
   };
   s = tempS;
}

用这个:

C::C() :
   s {
      // more than 52k lines of code!!!
   }
{
}

你可以see here它应该适用于支持C ++ 11或更高版本的编译器

答案 1 :(得分:0)

我会考虑将tempS作为C的私有静态常量成员(并在另一个编译单元中定义它)。这个初始化程序/原型基本上是数据,只是使代码不可读。此外,无论您在何处/如何定义二进制文件,二进制文件中的这些数据都是如此,因此您也可以将其显式化。

答案 2 :(得分:0)

我的建议是在课程S中创建一个构建器,该构造函数可以使所有成员'值作为参数。按照结构中定义的相同顺序定义构造函数的参数列表。

struct S
{
   // lots of real_T's and uint32_T's and structs and structs within structs
   S(/*parameter_lsit*/) : /*initializer_list*/ {}
};

并将其初始化为 -

S * tempS = new S (
    // more than 52k lines of code!!!
);