我有两个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 = ¤t_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;
}
答案 0 :(得分:1)
在联合中使用非平凡类型之前,必须通过在其上调用new放置来创建它:
new(&results.combined_row) std::vector<char*>();
然后您可以使用它:
results.combined_row.push_back(current_row);
使用后,您需要调用析构函数:
results.combined_row.~vector();
请注意,创建combined_row
时不允许访问其他工会成员。