2015-04-03 91 views
-1

我有以下功能:單元測試,返回一個指針(C++)函數

unsigned* b_row_to_array(b_row r) { 
    unsigned a[] = {(r >> 8) & 3, 
     (r >> 6) & 3, 
     (r >> 4) & 3, 
     (r >> 2) & 3, 
     r & 3}; 
    return a; 
} 

,我寫了下面的測試功能:

TEST_METHOD(BRowToArrayTest) { 
    unsigned expected[] = { 0, 0, 0, 0, 0 }; 
    unsigned* computed = b_row_to_array(0); 
    for (int i = 0; i < 1; i++) { 
     Assert::AreEqual(expected[i], computed[i]); 
    } 
} 

但測試失敗,並稱「預期:< 0>,實際:< 42348989>「,其中Actual的值與每個測試都不同,所以它必須讀取錯誤的地址。我是否使用指針錯誤或者它讀取了界限,因爲測試函數不在同一個項目中?我該如何解決這個問題?

+3

的一個'[]'壽命是多少? – 2015-04-03 15:01:32

+0

嗯,我認爲你暗示着[]不再處於指針指向的地址處?如果是這樣,我該如何解決這個問題,因爲C++不允許直接返回數組。 – Arthelais 2015-04-03 15:04:07

+0

另請參見http://stackoverflow.com/questions/7769998 – 2015-04-03 15:04:55

回答

0

這是因爲你的函數返回一個指向立即銷燬的局部變量的指針。如果你想要的工作,你將需要a持續

T* b_row_to_array(b_row r) { 
    T a = { ... }; 
    return &a; 
    // <== a destroyed, so we have dangling pointer 
} 

:這不是不同於你曾寫。這意味着,無論是分配的:

unsigned* b_row_to_array(b_row r) { 
    unsigned* a = new unsigned[5]; 
    ... 
    return a; 
} 

或者通過值返回它:

std::array<unsigned, 5> b_row_to_array(b_row r); 
+0

我習慣了分配方法,它解決了我的問題,非常感謝。 – Arthelais 2015-04-03 15:09:38