当从其他方法返回 vector 时,C++无法访问矢量元素

C++ cannot acces vector elements when vector is returned from other method

本文关键字:访问 元素 C++ 其他 方法 返回 vector      更新时间:2023-10-16

我有以下代码,它迭代了pqxx::result行向量的结果。

std::unique_ptr<std::vector<pqxx::result::tuple>>
  filteredRowsPtr = getFilteredAssignmentRowsPtr(unfilteredRows);
std::vector<pqxx::result::tuple> filteredRows = *filteredRowsPtr;
for(int i = 0; i < filteredRows.size(); i++)
{
  returnMap[occurenceStudentIdStr] = returnMap[occurenceStudentIdStr] + 1; 
    pqxx::result::tuple currRow = filteredRows[i];
    for(int j = 0; j < currRow.size(); j++)
    {
        std::cout << "j = " << currRow[j] << endl;        
    }
}

filteredRowsPtrvector<pqxx::result::tuple>unique_ptr,通过以下方法产生:

std::unique_ptr<std::vector<pqxx::result::tuple>> 
CompletedExcersisesPerStudent::getFilteredAssignmentRowsPtr(pqxx::result unfilteredRows)
{
    std::vector<pqxx::result::tuple> rowsFilteredOnGradePercentile = filter.getRowsWithValidGradePercentile(unfilteredRows);
    std::vector<pqxx::result::tuple> filteredRows = filter.getRowsWithValidAssignmentTimes(rowsFilteredOnGradePercentile);
    return std::make_unique<std::vector<pqxx::result::tuple>>(filteredRows);
} 

向量已填充(因为在其上调用 size() 会返回一个正数(,我可以很好地迭代它,但是当我尝试实际访问行中包含的元素时

currRow[j]

我遇到分段错误。

但是:当我将调用替换为以下内容时getFilteredAssignmentsRowPtr(),从而替换该方法的内容:

std::vector<pqxx::result::tuple> rowsFilteredOnGradePercentile = filter.getRowsWithValidGradePercentile(unfilteredRows);
std::vector<pqxx::result::tuple> filteredRows = filter.getRowsWithValidAssignmentTimes(rowsFilteredOnGradePercentile);

输出预期结果时没有任何段错误。

我做错了什么?提前感谢!

您的错误似乎不可重现(因为您未能提供最小可验证的完整示例(,但无论如何您的设计都是有缺陷的:不要使用 s td::unique_ptr<std::vector>std::vector已经支持内存管理,因此您无需添加 unique_ptr .IHMO,正确的设计会更像

std::vector<pqxx::result::tuple>
getFilteredAssignmentRowsPtr(pqxx::result unfilteredRows)
{
  return filter.getRowsWithValidAssignmentTimes(
         filter.getRowsWithValidGradePercentile(unfilteredRows));
} 
auto filteredRows = getFilteredAssignmentRowsPtr(unfilteredRows);
for(int i = 0; i < filteredRows.size(); i++)
{
  returnMap[occurenceStudentIdStr] = returnMap[occurenceStudentIdStr] + 1; 
  auto currRow = filteredRows[i];
  for(int j = 0; j < currRow.size(); j++)
  {
     std::cout << "j = " << currRow[j] << endl;        
  }
}

我通过将getFilteredAssignmentRows更改为返回向量而不是您建议的唯一 ptr 以及将对pqxx::result的引用传递给getFilteredAssignmentRows来解决此问题,如下所示:

std::vector<pqxx::result::tuple> CompletedExcersisesPerStudent::getFilteredAssignmentRowsPtr(pqxx::result& unfilteredRows)
{
    std::vector<pqxx::result::tuple> rowsFilteredOnGradePercentile = filter.getRowsWithValidGradePercentile(unfilteredRows);
    return filter.getRowsWithValidAssignmentTimes(rowsFilteredOnGradePercentile);
} 

这是有效的,因为filter.getRowsWithValidGradePercentile被定义为接受对pqxx::result的引用,而不是pqxx::result本身。

我一定是不小心看错了。

非常感谢