0

I have a quite complex Problem and couldn't find out, where the Problem is. Part of the Problem might be, that i didn't fully understand the data structures. I have the following custom template class, with this member variables:

template <class T>
class Matrix
{
 private:
  T * *M;             /* array of row pointers */
  size_t n_rows,      /* number of rows */
         n_cols;      /* number of columns */
  size_t row_start,   /* first row of submatrix */
         col_start,   /* first column of submatrix */
         origcols;    /* refers to original matrix */
  bool hasownvalues,  /* has matrix own value? */
       initialized;   /* are matrix values initialed? */  

I also made a custom constructor, which makes a 2D array out of a file with tab-separated data:

Matrix(const std::string &filename) 
{ do.stuff }

I'm not sure, if it is really important how this exactly works, it quite a bunch of code. if so, i could edit it later, but the constructor works well as long as i declare a single variable for such an object. My problem occurs when i try to make a bunch of the objects and try to wrap them up in a vector. Lets say i have x different files, each containing data for a matrix. I also have a vector in which the filenames are stored:

std::vector<std::string> filenames{};
  for (int idx = 3; idx < argc; idx++)
  {
    filenames.push_back(argv[idx]);
  }

So far this code works and it is mandatory that i keep it unchanged to keep the rest of the program working. The following is flexible and thats where i have problem:

std::vector<Matrix<T>> coredata; /* initialize the vector for the wrap */

   ...

for (auto& it : filenames)
{  
  Matrix<T> M(it);  /* call the special constructor*/  
  coredata.push_back(M); /* add new object to the vector */
}

The first assignment works well, but from the second on it seems that it appends the new Matrix, but also overwrites the old one or at least a part of it. And in the third one i get a segmentation fault when running the program.

Some information of the program around:

  • the constructor works with space allocated by the "new" command, maybe that could be part of the problem.
  • the real size of the Matrix object isn't known before run time. (the arrays can be of different size), but i could arrange, that the read data in fact always is of the same size
  • T is constant within the vector. it can't happen, that M is sometimes Matrix int and sometimes Matrix float
  • the vector would be embedded in another superclass and the snippet above is part of a constructor of this class, coredata is a member variable.

I'm quite puzzled what the problem exactly is. Maybe some variables don't live long enough. I also thought of assigning just a reference to the address in the vector, but as far as i understand, a vector already stores just a reference, so it seems not that plausible. I also thought of initializing the vector with a bunch of "0"-matrices and then overwrite them with the constructed objects. But i don't know how to do that and on top of that, i don't know at compile time how many rows and columns the read Matrices will have. Maybe a vector isn't a useful solution at all, i also thought of making a plain C-array. But there i have the problem again, that i have to initialize this array first and can't just append another Matrix-Object to it.

Ferrozin
  • 1
  • 1
  • 1
    Problem seems like a failure to follow the [rule of three](https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three). To put it briefly, you don't have a valid copy constructor and assignment operator for your class. – john Jul 05 '22 at 09:04
  • Vectors don't (in fact can't) store references. They store objects. They can store pointers though. At the minimum make sure you're aware of the [Rule of 5/3/0](https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) – Mat Jul 05 '22 at 09:05
  • you are already using `std::vector` but then why is the member a raw pointer and not a `std::vector` ? Pointers are not arrays, `/* array of row pointers */` this comment is wrong and misleading, and very likely this is part of your issue – 463035818_is_not_an_ai Jul 05 '22 at 09:07
  • Thanks so far. I workarounded it by storing a pointer to a Matrix in the vector, not the matrix itself. However, thanks for the advice, i look into the class to add some copy and assignment constructors. – Ferrozin Jul 12 '22 at 16:54

0 Answers0