首页 > > > 请各位C++大神来看看这段小程序有没有潜在的BUG
1 #include <iostream>
2 #include <vector>
3 #include <string.h>
4
5 using namespace std;
6
7 struct A{
8 int a;
9 char b[88];
10 char c[88];
11 };
12
13 typedef enum {
14 TYPE_INT = 1,
15 TYPE_VARCHAR2 = 2,
16 TYPE_DATE
17 }ORA_DATATYPE_E;
18
19 typedef struct {
20 ORA_DATATYPE_E type;
21 void * addr;
22 }ORA_ABSTRACT_DATA_T;
23
24 void func(const vector<ORA_ABSTRACT_DATA_T> & vec) {
25 for (int i = 0; i < (int)vec.size(); i++) {
26 if (vec[i].type == TYPE_INT) {
27 std::cout << "int : " << *((int *)vec[i].addr) << std::endl;
28 } else if (vec[i].type == TYPE_VARCHAR2) {
29 std::cout << "varchar2 : " << (char *)vec[i].addr << std::endl;
30 }
31 }
32 }
33
34 int main(void) {
35
36 struct A a;
37
38 memset(&a, 0, sizeof(a));
39
40 a.a = 4;
41 memcpy(a.b, "abcd", strlen("abcd"));
42 memcpy(a.c, "efgh", strlen("efgh"));
43
44 vector<ORA_ABSTRACT_DATA_T> vec;
45 ORA_ABSTRACT_DATA_T data;
46
47 data.type = TYPE_INT;
48 data.addr = (void *) new int;
49 memcpy(data.addr, &a.a, sizeof(a.a));
50 vec.push_back(data);
51
52 data.type = TYPE_VARCHAR2;
53 data.addr = (void *) new char[strlen(a.b)];
54 memcpy(data.addr, a.b, strlen(a.b));
55 vec.push_back(data);
56
57 data.type = TYPE_VARCHAR2;
58 data.addr = (void *) new char[strlen(a.c)];
59 memcpy(data.addr, a.c, strlen(a.c));
60 vec.push_back(data);
61
62 func(vec);
63
64 for (int i = 0; i < (int)vec.size(); i++) {
65 if (vec[i].type == TYPE_INT) {
66 if (vec[i].addr) {
67 delete (int *)vec[i].addr;
68 vec[i].addr = NULL;
69 }
70 } else if (vec[i].type == TYPE_VARCHAR2) {
71 if (vec[i].addr) {
72 delete (char *)vec[i].addr;
73 vec[i].addr = NULL;
74 }
75 }
76 }
77
78 vec.clear();
79
80 }我想用这种方式,将一个大型结构体中的数据存放到vector中,这样就可以在get数据库SQL插入语句时,使用for循环来bind参数,不用把结构体中的变量一一列举出来了。
现在这样写,在本机运行是正常的,但理论上是不是存在什么风险呢?
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4692/viewspace-3126491/ ,如需转载,请注明出处,否则将追究法律责任。