Проблема с memset после создания экземпляра определенного пользователем класса и открытия файла - PullRequest
2 голосов
/ 16 марта 2010

У меня странная проблема с memset, это было связано с классом, который я создаю перед ним, и файлом, который я открываю в конструкторе.Класс, с которым я работаю, обычно читает в массиве и преобразует его в другой массив, но это не важно.Класс, с которым я работаю:

#include <vector>
#include <algorithm>
using namespace std;
class PreProcess
{
 public:
  PreProcess(char* fileName,char* outFileName);
  void SortedOrder();
 private:
  vector< vector<double > > matrix;
  void SortRow(vector<double> &row);
  char* newFileName;
  vector< pair<double,int> > rowSorted;
};

Другие функции не важны, потому что я перестал их вызывать, и проблема сохраняется.По сути, я сузил его до моего конструктора:

PreProcess::PreProcess(char* fileName,char* outFileName):newFileName(outFileName){
  ifstream input(fileName);
  input.close(); //this statement is inconsequential
}

Я также прочитал в файле в моем конструкторе, но я обнаружил, что проблема сохраняется, если я не читаю в матрице и простооткройте файл.По сути, я сузил это до того, что, если я закомментирую эти две строки, memset будет работать правильно, иначе это не так.

Теперь в контексте проблемы, с которой я столкнулся: я написал свой собственный простой класс-оболочку для матриц.Он не имеет большой функциональности, мне просто нужны 2D-массивы в следующей части моего проекта, и с дескриптором класса все имеет для меня больше смысла.

Заголовочный файл:

#include <iostream>
using namespace std;
class Matrix{
 public:
  Matrix(int r,int c);
  int &operator()(int i,int j)
  {//I know I should check my bounds here
    return matrix[i*columns+j];
  }
  ~Matrix();
  const void Display();
 private:
  int *matrix;
  const int rows;
  const int columns;
};

Драйвер:

#include "Matrix.h"
#include <string>
using namespace std;
Matrix::Matrix(int r,int c):rows(r),columns(c)
{
  matrix=new int[rows*columns];
  memset(matrix,0,sizeof(matrix));
  }
const void Matrix::Display(){
  for(int i=0;i<rows;i++){
    for(int j=0;j<columns;j++)
      cout << (*this)(i,j) << " ";
    cout << endl;
  }
}
Matrix::~Matrix()
{
  delete matrix;
}

Моя основная программа запускается:

PreProcess test1(argv[1],argv[2]);
//test1.SortedOrder();
Matrix test(10,10);
test.Display();

И когда я запускаю это без строки комментария, я получаю:

0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 -1371727776 32698 -1 0 
0 0 0 0 6332656 0 -1 -1 0 0 
6332672 0 0 0 0 0 0 0 0 0 
0 0 0 0 -1371732704 32698 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 

Я действительноне имею понятия, что происходит в памяти, чтобы вызвать это, на заметку, если я заменю memset на:

for(int i=0;i<rows*columns;i++)
   *(matrix+i) &= 0x0;

Тогда это работает отлично, это также работает, если я не открываю файл,Если это поможет, я использую 64-битную версию GCC 4.2.4 в Ubuntu. Я предполагаю, что есть некоторые функции memset, которые я не совсем понимаю.

1 Ответ

3 голосов
/ 16 марта 2010

Вы используете memset() так:

memset(matrix,0,sizeof(matrix));

Здесь matrix - указатель, поэтому sizeof(matrix) дает размер указателя, а не размер массива. Чтобы заполнить весь массив, используйте columns * rows * sizeof(int).

...