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

时间:2017-05-18 14:44:23

标签: c++ vector

我有以下代码,它迭代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;        
    }
}

filteredRowsPtrunique_ptrvector<pqxx::result::tuple>,它是通过以下方法生成的:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

unique_ptr

答案 1 :(得分:0)

我修改了此问题,方法是更改​​getFilteredAssignmentRows以返回向量而不是您建议的唯一ptr,以及将引用传递给pqxx::resultgetFilteredAssignmentRows,如下所示:< / p>

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本身。

我一定是误读了这个。

非常感谢!