2017-05-18 8 views
0

次のコードを持っています。これはpqxx::result行のベクトルの結果を反復処理します。ベクトルが他のメソッドから返されたときにC++がベクトル要素にアクセスできません

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

filteredRowsPtr以下の方法により製造されるvector<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] 

義務違反。

しかし:

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

期待される結果は、任意のセグメンテーション違反せずに出力される:私は以下のようなものをその方法の内容を置き換え、以下でgetFilteredAssignmentsRowPtr()にコールを交換します。

私は間違っていますか?前もって感謝します!

+3

スコープ外に出るローカル変数へのポインタを返すようです。なぜポインタが必要なのか尋ねることはできますか? –

+3

'unique_ptr'は完全に冗長です。 – You

+0

私はstd :: vector >を返そうとしました。これはうまくいきませんでしたので、私はptrを使ってみました。 –

答えて

1

あなたのエラーは再現性がありません(最小限の完全な例を提供できなかったため)が、とにかくデザインに欠陥があります:td::unique_ptr<std::vector>を使用しないでください。 std::vectorは既にメモリ管理をサポートしていますので、追加する必要はありません。unique_ptr。私はあなたが示唆したようにユニークなPTRの代わりにベクトルを返すようにgetFilteredAssignmentRowsを変更するだけでなく、そのようgetFilteredAssignmentRowspqxx::resultへの参照を渡すことによって、問題を修正し、より

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

ようIHMOは、正しい設計は次のようになります。

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への参照を取るように定義されているので、これは動作します。

私はこれを間違って誤読する必要があります。

ありがとうございます。

関連する問題