Je suis en train de jouer avec des flux et je n'arrive pas à comprendre ce qui suit.Comment détecter si un PTR fait toujours référence à une référence valide après que cette référence est hors de portée
Ici, nous avons un ostream ptr de base qui est mis à différents flux de sortie, que ce soit cout
, cerr
ou file
.
// ostream ptr
std::ostream* outstream;
// set output ostream
void setOutput(std::ostream & os)
{
outstream = &os;
}
// write message to ostream
void writeData(const std::string & msg)
{
*outstream << msg << '\n';
}
int main (int argc, char * const argv[])
{
// init to std out
setOutput(std::cout);
writeData("message to cout");
setOutput(std::cerr);
writeData("message to cerr");
std::ofstream fileout("test.txt", std::ofstream::out | std::ofstream::app);
setOutput(fileout);
writeData("message to file");
//fileout.close();
setOutput(std::cout);
writeData("message2 to cout");
return 0;
}
Ce qui précède fonctionne parfaitement et montre la force de la mise en œuvre de l'iostream C++. Parfait.
Cependant, puisque le setOutput
est défini par référence, l'objet référencé doit rester dans la portée. C'est là que le problème émerge. Je veux trouver un moyen de mettre par défaut la sortie à std::cout
si l'ofstream ou tout autre ostream est invalidé. Autrement dit, l'objet référencé est ou est sorti de la portée.
Par exemple:
// write message to ostream
void writeData(const std::string & msg)
{
if (/*stream or memory is invalid*/)
setOutput(std::cout);
*outstream << msg << '\n';
}
// local fileout goes out of scope
void foo()
{
std::ofstream fileout("test.txt", std::ofstream::out | std::ofstream::app);
setOutput(fileout);
writeData("message to file");
}
int main (int argc, char * const argv[])
{
setOutput(std::cout);
writeData("message to cout");
foo();
/* problem the local fileout is no longer referenced by the ostream ptr*/
/* the following should be redirected to std::cout cuz of default*/
writeData("message2 to cout");
return 0;
}
Ce qui précède est bien jusqu'à ce que les foo()
revient à la fonction principale. Là, il va horrible mal parce que le ofstream
localement défini n'est plus accessible.
De toute évidence, ce n'est pas conseillé et l'utilisateur devrait s'en rendre compte. Cependant, je veux emballer tout cela dans une classe de journalisation et ainsi garder l'état de l'objet valide même si cette mauvaise utilisation pourrait se produire. Cela entraînera une violation d'accès invalide qui peut être difficile à trouver.
Question concrète. Existe-t-il un moyen de déterminer si un ostream ptr ou un ptr fait toujours référence à un objet valide ou à un emplacement mémoire?
ps: je pourrais utiliser la mémoire du tas et faire quelque chose avec des pointeurs intelligents, mais franchement je veux continuer comme ça si possible
"Question concrète: existe-t-il un moyen de déterminer si un ostream ptr ou un ptr d'ailleurs fait toujours référence à un objet valide ou à un emplacement mémoire?" - oui: Java. – nicomp
@nicomp n'aime pas java – Montaldo
@Captain Obvlious mais tout est sur la pile. J'ai essayé cela, mais vous ne pouvez toujours pas détecter si elle est sortie de la portée – Montaldo