我在预先存在的结构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;
........
........
}
答案 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是最合适的方法。