[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux] [C++] Re: C++ / C re-question
> Je me posais une chtite question en cpp: Lorsque je definis ceci:
> class machin {
> public:
> operator char* ();
> };
> machin::operator char* () {
> char buf[10];
> sprintf(buf, etc..)
> return buf;
> }
> (ceci est tiré du cours de Cpp de Vilvens) ..
Ouh la... ;)
C'est mortel, bien évidemment.
Faut faire:
machin::operator char* () {
char* buf = new char[10];
sprintf(buf, 10, ...);
return buf;
}
> Je me suis toujours dis que les variables declarées dans une fonction le
> sont sur le stack (ben j'en suis certain, sinon, pas de buffer overflow ..),
bien sur
> donc cette chaine de caractere est bel et bien definie sur le stack et au
> retour de la fonction, cette valeur ne devrait plus etre valide ... si
exact
> j'avais aloué sur le heap par un new, ca serait ok; mais la ....
> kkun peut m'expliquer ca ?
Ben oui, bien vu ;)
Note que tu risques d'avoir un problème de toute facon avec ce genre de trucs.
Si celui qui appelle cette méthode ne pense pas à faire un delete du pointer
qu'il recoit, tu auras un memory leak (de la mémoire allocée dynamiquement que
personne ne va détruire).
En général, vaut mieux éviter ce genre de trucs (et surtout char*) et utiliser
soit std::string de la STL, soit un smart pointer, du genre
template <class T>
class SmartPointer {
private:
T* pointer_;
public:
SmartPointer(T* pointer) : pointer_(pointer) { }
SmartPointer(const SmartPointer& sp)
: pointer_(sp.pointer) { }
virtual ~SmartPointer() {
delete pointer_;
}
T* operator->() const {
return pointer_;
}
};
L'astuce étant que lorsque le SmartPointer est out of scope, il va faire
un delete sur le pointer.
--
-o) / Pascal Bleser ATOS Origin|
/\\ \ e-Business Platform Aachen, Germany|
_\_v \<guru@linuxbe.org> <pbleser@atosorigin.com>|
---------------------------------------------------|
Jesus saves, but Buddha makes incremental backups :
---------------------------------------------------'
[ Soyez précis dans vos sujets svp afin de déterminer directement ]
[ le type de demande... ]
[ Pour vous (dés)inscrire, aller sur http://linuxbe.org/ml.php ]
[ http://LinuxBe.org Contact: listmaster@linuxbe.org ]