【问题标题】:Unit testing a function that returns a pointer (C++) [duplicate]单元测试返回指针的函数(C++)[重复]
【发布时间】:2015-04-03 14:59:31
【问题描述】:

我有以下功能:

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

但是测试失败了,说“预期:,实际:”,每次测试的实际值都不同,所以它必须读取错误的地址。我是使用错误的指针还是因为测试函数不在同一个项目中而读取越界?我该如何解决这个问题?

【问题讨论】:

  • a[] 的生命周期是多少?
  • 啊,我认为您是在暗示 a[] 不再是指针指向的地址?如果是这样,我该如何解决这个问题,因为 C++ 不允许直接返回数组。
  • 为什么不能使用标准容器,比如std::vector&lt;unsigned&gt;?如果你必须留在你的数组中,也许用 C 的方式来做,并将一个指向 a 的指针传递给你的函数,然后将它填充到函数中。

标签: c++ unit-testing pointers


【解决方案1】:

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

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

【讨论】:

  • 我用过分配方法,解决了我的问题,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 2018-03-23
  • 2015-02-18
  • 2012-08-01
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多