Segfault инициализирует ссылочную переменную в стеке в gtest - PullRequest
0 голосов
/ 17 октября 2018

Я создаю тест для моего контейнера TwoDArray, и у меня появляется ошибка.Объект TwoDArray отлично инициализируется в куче, но когда я пытаюсь протестировать его в стеке, я получаю segfault.Он использует вектор в куче в качестве основного контейнера.Я отлично инициализировал вектор, но объект TwoDArray выдает segfault, как только он запускается.

Я вырезал функции, так как я в основном занимаюсь инициализацией.

 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 не делает.Может быть, я не понимаю, как что-то инициализировать.

1 Ответ

0 голосов
/ 17 октября 2018

Ваш конструктор по умолчанию не делает то, что вы думаете, что он делает.Он оставляет различные переменные-члены неинициализированными, а затем создает временный TwoDArray объект.

То, что вы хотите для делегирующего конструктора, это

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