单元测试返回指针的函数(C ++)

时间:2015-04-03 14:59:32

标签: c++ unit-testing pointers

我有以下功能:

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

但测试失败,说“预期:&lt; 0&gt;,Actual:&lt; 42348989&gt;”,其中Actual的值与每次测试都不同,因此必须读取错误的地址。我使用指针错误还是读取越界因为测试函数不在同一个项目中?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

那是因为你的函数返回一个指向一个立即被销毁的局部变量的指针。它和你写的没什么不同:

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

如果您希望这样做,则需要a才能使用。这意味着要么分配它:

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