J'ai un problème étrange avec memset, qui a quelque chose à voir avec une classe que je crée avant et un fichier I ' m ouverture dans le constructeur. La classe avec laquelle je travaille lit normalement dans un tableau et le transforme en un autre tableau, mais ce n'est pas important. La classe Je travaille avec est:Problème avec memset après qu'une instance d'une classe définie par l'utilisateur est créée et qu'un fichier est ouvert
#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;
};
Les autres fonctions ne sont pas importants, parce que je l'ai arrêté de les appeler et le problème persiste. Essentiellement, je l'ai réduit à mon constructeur:
PreProcess::PreProcess(char* fileName,char* outFileName):newFileName(outFileName){
ifstream input(fileName);
input.close(); //this statement is inconsequential
}
Je lis aussi dans le fichier dans mon constructeur, mais je l'ai trouvé que le problème persiste si je ne lis pas dans la matrice et juste ouvrir la fichier. Essentiellement je l'ai réduit à si je commente ces deux lignes le memset fonctionne correctement, sinon il ne fonctionne pas.
Maintenant, dans le contexte du problème que j'ai avec: j'ai écrit ma propre classe d'emballage simple pour les matrices. Il n'a pas beaucoup de fonctionnalités, j'ai juste besoin de tableaux 2D dans la partie suivante de mon projet et avoir une classe gérer tout ce qui a plus de sens pour moi.
Le fichier d'en-tête:
#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;
};
Driver:
#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;
}
Mon principal programme fonctionne:
PreProcess test1(argv[1],argv[2]);
//test1.SortedOrder();
Matrix test(10,10);
test.Display();
Et quand je lance cela avec la ligne d'entrée décommenté je reçois:
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
Je n'ai pas la moindre idée ce qui se passe dans la mémoire pour provoquer ce, sur une note de côté si je remplace memset avec:
for(int i=0;i<rows*columns;i++)
*(matrix+i) &= 0x0;
Ensuite, il fonctionne parfaitement, cela fonctionne aussi si je ne ouvre le fichier. Si cela fonctionne, j'utilise la version 4.2.4 de GCC 64 bits sur Ubuntu. Je suppose qu'il y a des fonctionnalités de memset que je ne comprends pas correctement.
Dans le destructeur, vous voudrez peut-être ajouter [] après la suppression sinon il fuira la mémoire – mukeshkumar
Et assurez-vous d'implémenter ou de supprimer le constructeur de copie et l'opérateur d'affectation pour éviter la double suppression. Ou (comme quelqu'un le dit invariablement dans n'importe quelle question impliquant la gestion manuelle de la mémoire) utiliser un 'vecteur'. –