c++ - 两个 std::vector 的 union 读取访问冲突

标签 c++ vector struct unions push-back

<分区>

我有两个 std::vectors 的 union ,当我调用 push_back 时,我遇到了读取访问冲突。我对 union 很陌生,所以我敢打赌我对他们做错了什么。知道为什么会这样吗?

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 vector 。目前,您只需给它一个指针,它就会将结果写入该内存位置。我想要一个函数将结果返回到我指定的结构中,但每个 SQL 查询的结果中可能有不同的字段。我以为 union 会让我将结果写入一个字符数组,然后将其作为我指定的结构读取。

我可能会运行一个返回 10 行的 SQL 查询,每行包含一个整数和一个字符数组。我还可能运行一个返回 100 行的查询,每行包含一个 bool 值、一个整数和两个字符数组。

在第一个示例中,我希望在包含一个整数和一个字符数组的结构 vector 中得到结果。在第二个示例中,我想要一个包含 bool 值、整数和两个字符数组的结构 vector 中的结果。

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

执行此操作的示例函数:

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;
}

最佳答案

在 union 中使用非平凡类型之前,必须通过对其调用 placement new 来创建它:

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

然后就可以使用了:

results.combined_row.push_back(current_row);

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

results.combined_row.~vector();

请注意,在创建 combined_row 时,您不能访问其他 union 成员。

关于c++ - 两个 std::vector 的 union 读取访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53620998/

相关文章:

c++ - 无法编译 Crow 示例 - boost/optional.hpp : No such file or directory

c++ - 使用 doxygen 生成文档

c++ - 具有继承的C++中的段错误

C++复制结构未解析的链接

c - 如何在结构中将 char + int 存储为相同类型和相同成员?

c++ - 没有从 long unsigned int 到 long unsigned int& 的转换

c++ - 将 C++ argv[] 解释为变量与 CERN 的 ROOT 之间的关系

c++ - 如何使用循环将 vector 插入队列<vector<int>>?

c++ - 在 unordered_map 中插入一个元素会出错

c - 在函数调用期间结构更改的 union 内的结构