ITPub博客

首页 > > > 请各位C++大神来看看这段小程序有没有潜在的BUG

请各位C++大神来看看这段小程序有没有潜在的BUG

作者:daxuesheng 时间:2019-09-19 11:05:48 0 删除 编辑
 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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-05-22

  • 博文量
    176
  • 访问量
    24989