两个std :: vector读访问冲突的并集

时间:2018-12-04 20:35:13

标签: c++ vector struct unions push-back

我有两个std :: vectors的并集,当我调用push_back时遇到读取访问冲突。我是工会的新手,所以我敢打赌我对他们做错了。任何想法为什么会这样?

struct Row
{
    char order_id[30];
    char garbage[994];
    Row() {}
    ~Row() {}
};

struct Row_List
{
    union
    {
        std::vector<Row> divided_row;
        std::vector<char*> combined_row;
    };
    Row_List() {}
    ~Row_List() {}
};

int main(void)
{
    Row_List results;

    char current_row[1024];

    //initialize row to null
    for (int i = 0; i < 1024; ++i)
    {
        current_row[i] = '\0';
    }

//error happens here
    results.combined_row.push_back(current_row);

    return 0;
}

编辑: 我最终的总体目标是简化SQLGetData(在SQL.h中)方法,方法是将结果写入Row的向量中。当前,您只需要给它一个指针,它将结果写入该内存位置。我想要一个函数将结果返回到我指定的结构中,但是每个SQL查询的结果中可能都有不同的字段。我以为工会可以让我将结果写到char数组中,然后将其作为我指定的结构读取。

我可能会运行一个SQL查询,该查询返回10行,每行包含一个整数和一个char数组。我可能还会运行一个查询,该查询返回100行,每行包含一个布尔值,一个整数和两个char数组。

在第一个示例中,我希望结果在包含整数和char数组的结构向量中产生。在第二个示例中,我想要一个结果结构的向量,该结构包含一个布尔值,一个整数和两个char数组。

主要问题是我想要一种通用的方式来写入任何结构。不过,我可以传递数据类型大小的列表。

执行此操作的示例功能:

bool SQL_Query::write_results(std::vector<std::array<char, 1024> >& results_vector)
{
    /*
    user makes a union of (a vector of long chars, and a vector of several small chars, ints etc.)
    they pass the vector of long chars into this function
    */

    //if not connected or if the query isnt successful or if the row structure hasnt been set then do nothing
    if (!m_connected || !m_query_successful || !m_row_structure_set)
    {
        return false;
    }

    //for each row
    while (SQLFetch(m_SQL_statement_handle) == SQL_SUCCESS)
    {
        //declare a single row
        std::array<char, 1024> current_row;

        //initialize row to null
        for (int i = 0; i < 1024; ++i)
        {
            current_row[i] = '\0';
        }

        char* current_location = &current_row[0];

        //for each column
        for (unsigned int current_col = 1; current_col <= m_memory_size_list.size(); ++current_col)
        {
            //get next results max memory size
            int current_buffer_size = m_memory_size_list.at(current_col - 1);

            //write that into current_row at current_location
            SQLGetData(m_SQL_statement_handle, current_col, SQL_C_DEFAULT, current_location, current_buffer_size, NULL);

            //move to next write location in current_row by adding the current max memory size to 
            current_location += current_buffer_size;
        }

        //add single row to results vector
        results_vector.push_back(current_row);
    }

    //return true if everything went right
    return true;
}

1 个答案:

答案 0 :(得分:1)

在联合中使用非平凡类型之前,必须通过在其上调用new放置来创建它:

new(&results.combined_row) std::vector<char*>();

然后您可以使用它:

results.combined_row.push_back(current_row);

使用后,您需要调用析构函数:

results.combined_row.~vector();

请注意,创建combined_row时不允许访问其他工会成员。