结构

时间:2016-05-13 01:42:53

标签: c++ vector

我在预先存在的结构St中引入了一个新的向量,就像这样std::vector<X> xInfo; X是另一个新定义的结构,具有原始数据类型的成员。现在有一个预先存在的代码,例如memset(&s, 0, sizeof(St));,其中s是St.的实例。由于向xInfo添加了向量St,它会导致什么类型的问题?

如何克服这些问题,以便我可以将新的向量保留在结构中?

编辑:以下是情况的示例代码

// Below section is new code.

typedef struct
{
    char    m11;
    int     m12;
    char    m13[50];
}X;
// Below section is existing code.

typedef struct{
    char             m1[10];
    int              m2;
    long             m3;
    double           m4;
    vector<X>        xInfo;   /* this line is newly added code */
}St;

void fun(const char* a1, int a2, long m3, double m4)
{
    St    s;

    memset(&s, 0, sizeof(St));

    if(NULL != a1 && 0 != a1[0])
        strncpy(m1, a1, 9);

    m2 = a2;
    m3 = a3;
    m4 = a4;

    ........
    ........
}

2 个答案:

答案 0 :(得分:2)

这将导致未定义的行为。

翻译:很可能是崩溃。

答案 1 :(得分:1)

memset()肯定会混淆你的运行时间。

St    s;
memset(&s, 0, sizeof(St));

因为s包含一个std :: vector,你的向量将被这个memset()踩踏,而不是你想要它。

正如我在上面的评论中所说,你知道std :: vector&lt;&gt;建成。例如,在Ubuntu 15.10上,使用g ++ 5.2.1,std :: vector&lt;&gt;不管有多少元素,只有24个字节。以下是我的一个小程序的部分输出:

typedef std::vector< UI224 >  VecUI224;
sizeof(VecUI224)                : 24

VecUI224 vui224; 
sizeof(vui224)  : 24    vui224.size() = 000000    vui224.capacity() : 00000
sizeof(vui224)  : 24    vui224.size() = 000001    vui224.capacity() : 00001
sizeof(vui224)  : 24    vui224.size() = 100       vui224.capacity() : 128
sizeof(vui224)  : 24    vui224.size() = 200       vui224.capacity() : 256
// ...
sizeof(vui224)  : 24    vui224.size() = 900       vui224.capacity() : 1024
sizeof(vui224)  : 24    vui224.size() = 1000      vui224.capacity() : 1024

恕我直言(我还没有检查过矢量模板代码)24个字节包含一些指针和开销。推断的指针指向堆,并且没有数据将在向量对象中。用memset()踩踏只会破坏向量,X的数据不存在

您现有的memset()只会消除这些向量指针和开销,但不会消除数据。可能导致崩溃。

初始化结构(或类)的正确方法是创建构造函数并通过初始化列表适当地分配值。

示例1是C样式,您确实需要转到C ++:

typedef struct{
   char             m1[10];
   int              m2;
   long             m3;
   double           m4;
   vector<X>        xInfo;   /* this line is newly added code */
}St;

可能的C ++方法:创建ctor,添加初始化列表。

struct St_t    // I use suffix '_t' to indicate a type
{
   St_t (void) :  // ctor
      // m1[10]  see body of ctor
      m2 (0),
      m3 (0),
      m4 (0)
      // xInfo - see default ctor of X_t below
   {
       // it is ok to consider this, but raises the wtf factor
       ::memset(m1, 0, 10); // for the single pod
   }
   char             m1[10];
   int              m2;
   long             m3;
   double           m4;

   vector<X_t>        xInfo;   /* this line is newly added code */
};

对于xInfo,C ++方法可能类似于以下内容:

struct  X_t
{
   X_t(void) :    // type X_t default dtor
       m11(0), 
       m12(0) 
       // m13 
   {
      // I would fill m13 with
      for (int i=0;i<50; ++i)
         m13[i] = 0;
   }
   char    m11;
   int     m12;
   char    m13[50];
};

在ctor期间,所有数据字段都已初始化(此处为0)。 每次实例化另一个实例时,这些ctor都会确保数据被初始化。

  

......还有其他解决方案......?

软件具有无限灵活性,但是ctor是最简单,最自我记录的方法。

  

如何克服这些问题,以便我可以保留新的向量   结构?

我认为将矢量保留在旧结构中没有问题。 ctor是最合适的方法。