J'optimise actuellement une application gourmande en mémoire pour occuper moins de mémoire. Ce que j'essaie de faire dans le code suivant est d'allouer dynamiquement les objets du flux de fichiers ifstream
et ofstream
afin de les libérer exactement après que son utilisation ne soit plus nécessaire. Le code fonctionne parfaitement pour l'allocation/désaffectation de ofstream
mais tombe en panne à l'exécution en raison d'un éventuel défaut de segmentation lorsque le contenu de la mémoire de ifstream
est désaffecté. Ce qui suit est un extrait du code d'origine:Erreur d'exécution inattendue (erreur de segmentation)
#include <fstream>
using namespace std;
// Dummy class to emulate the issue at hand
class dummy {
private:
int randINT;
static bool isSeeded;
public:
dummy() { randINT=rand(); }
int getVal() { return randINT; }
};
bool dummy::isSeeded=false;
int main(int argc, const char* argv[]) {
// Binary file I/O starts here
dummy * obj;
ofstream * outputFile;
ifstream * inputFile;
outputFile=new ofstream("bFile.bin",ios::binary);
if (!(*outputFile).fail()) {
obj=new dummy;
cout << "Value to be stored: " << (*obj).getVal() << "\n";
(*outputFile).write((char *) obj, sizeof(*obj)); // Save object to file
(*outputFile).close();
delete obj;
// don't assign NULL to obj; obj MUST retain the address of the previous object it pointed to
} else {
cout << "Error in opening bFile.bin for writing data.\n";
exit(1);
}
delete outputFile; // This line throws no errors!
inputFile=new ifstream("bFile.bin",ios::binary);
if (!(*inputFile).fail()) {
(*inputFile).read((char *) obj,sizeof(dummy)); // Read the object of type 'dummy' from the binary file and allocate the object at the address pointed by 'obj' i.e. the address of the previously de-allocated object of type 'dummy'
cout << "Stored Value: " << (*obj).getVal() << "\n";
(*inputFile).close();
} else {
cout << "Error in opening bFile.bin for reading data.\n";
exit(1);
}
delete inputFile; // Runtime error is thrown here for no reason!
cout << "\n-----END OF PROGRAM-----\n";
}
Le code ci-dessus enregistre un objet à un fichier binaire lorsque l'utilisateur évoque enregistrer des fonctions. Comme indiqué dans le code ci-dessus, la désaffectation du pointeur inputFile
génère une erreur d'exécution.
S'il vous plaît noter que j'utilise clang (plus précisément, clang ++) pour compiler le projet.
Merci d'avance.
S'il vous plaît [modifier] votre question pour fournir un [mcve]. –
Vous venez d'un arrière-plan Java ou C#? Parce qu'en C++ vous n'avez pas besoin d'utiliser 'new' pour créer une instance d'objets. Et cela conduit à moins de pointeurs, et moins de pointeurs sont une bonne chose parce que l'utilisation de pointeurs à tort est la raison la plus fréquente de plantages. –
'outputFile = new ofstream (" bFile.bin ", ios :: binary);' est une très mauvaise idée ... Essayez-vous délibérément de vaincre [RAII] (https://en.wikipedia.org/wiki/ Resource_acquisition_is_initialization)? – WhiZTiM