在 gtest 中初始化堆栈上的引用变量的隔离错误



我正在为我的 TwoDArray 容器创建一个测试,但遇到了段错误。TwoDArray 对象在堆上初始化正常,但是当我尝试在堆栈上测试它时,我得到一个段错误。它使用堆上的向量作为基础容器。我初始化了一个向量非常好,但是TwoDArray对象在运行时就会出现段错误。

我已经删除了函数,因为我主要关心初始化。

21 template<typename T>
22 class TwoDArray{
23 
24   private:
25     int numRows;
26     int numCols;
27     std::vector<T> * vecPtr; // Underlying container
28 
29   public:
30     TwoDArray(){ TwoDArray( DEF_ROW_SIZE, DEF_COL_SIZE ); }
...
40     TwoDArray( int m, int n ):numRows(m), numCols(n),
41                               vecPtr(new std::vector<T>(m*n)){ }
...
43     /* Destructor that specifies the size of the 2D Array
44      */
45     ~TwoDArray(){ delete vecPtr; }
...

然后实际测试:

2 #include <vector>
3 #include <gtest/gtest.h>
4 #include "TwoDArray.hpp"
5 
6 class TestTwoDArray : public testing::Test{
7   public:
8 
9     TwoDArray<int> arr1;
10     std::vector<int> vec;
11 
12     virtual void SetUp(){
14     }
15 
16     virtual void TestDown(){
17     }
18 };
19 
20 TEST_F( TestTwoDArray, validSizeTest ){
21   //arr1 = TwoDArray<int>();
22   
24 }
25 
30 int main(int argc, char* argv[]){
31   TwoDArray<int> arr1;
32   testing::InitGoogleTest(&argc,argv);
33   return RUN_ALL_TESTS();
34 }

我还有另一个类可以在堆上创建对象。这里第 9 行给出了段错误。但第 31 行没有。也许我不明白如何初始化某些东西。

默认构造函数不会执行您认为的操作。 它使各种成员变量保持未初始化状态,然后创建一个临时TwoDArray对象。

你想要的委托构造函数是

TwoDArray(): TwoDArray( DEF_ROW_SIZE, DEF_COL_SIZE ) { }

最新更新