Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[BCB6 /STL] Violation d'acces dans un classe et sa collection

39 réponses
Avatar
Olivier
Bonjoiur
je fait une collection d'article (std::vector<TArticle *> _pCoArt;)

le probleme quand je supprime un article
ou quand il est le dernier et que je veuille en ajouter un
autre j'ai une violation d'acces

voici le code de la suppression :


bool __fastcall TCoArticles::DeleteArticle(TArticle& Art)
{//@CODE_347

bool bRes=false;

if(int max =Count()>0){

int i=0;

if(SearchArticle(Art,i)){

TArticle *_pArt=_pCoArt.at(i);

if(i==max || max==1){
_pCoArt.push_back();
}else{
_pCoArt.erase(&_pArt);
}
delete _pArt;
bRes=true;
}
}else{
TMyError Err(7,"Collection d'article est vide");
throw Err;
}
return bRes;
}//@CODE_347


le code SearchArticle

bool __fastcall TCoArticles::SearchArticle(TArticle& Art, int& i)
{//@CODE_357
bool bRes=false;
std::vector<TArticle*>::iterator i_end =_pCoArt.end();
int j=0;

for(std::vector<TArticle*>::iterator it=_pCoArt.begin();it!=i_end;++it){

if((*it)->NomArt==Art.NomArt && (*it)->Description==Art.Description &&
(*it)->Categorie==Art.Categorie && (*it)->Prix==Art.Prix){

i=j;
bRes=true;
break;

}
j++;
}

return bRes;
}//@CODE_357

ou est mon erreur ?
que dois je faire ?

merci de vos reponses....
--
Cordialement ,
Sarda Olivier

Site Web:
http://membres.lycos.fr/osarda

10 réponses

1 2 3 4
Avatar
Christophe Lephay
"Olivier" a écrit dans le message de
news:3f24ea3a$0$24784$
if(i==max || max==1){
_pCoArt.push_back();
}else{
_pCoArt.erase(&_pArt);
}
delete _pArt;


Peut-être c'est mieux de faire le delete avant l'erase...

Par ailleurs, je comprends pas trop à quoi sert ton push_back...

Chris

Avatar
Olivier
c'etait pas push_back mais pop_back
Avatar
Luc Hermitte
"Olivier" wrote in
news:3f24f839$0$24583$:

J'ai regarde par rapport a la doc
quand c'est le dernier onfait un push_back non ?


Non. Quand c'était le dernier, après il n'y en a plus et on tombe sur
l'égalité begin() == end().

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

Avatar
Fabien LE LEZ
On Mon, 28 Jul 2003 11:15:27 +0200, "Olivier" wrote:

je fait une collection d'article

(std::vector<TArticle *> _pCoArt;)


Ça, c'est une collection de _pointeurs_ vers des articles. Es-tu bien
sûr que c'est ce que tu veux ?
En général, on utilise plutôt un std::vector<TArticle> : l'intérêt de
la STL, c'est justement de ne pas à aller tripatouiller dans les
new/delete...


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Luc Hermitte
Fabien LE LEZ wrote in
news::

On Mon, 28 Jul 2003 11:15:27 +0200, "Olivier" wrote:

je fait une collection d'article

(std::vector<TArticle *> _pCoArt;)


Ça, c'est une collection de _pointeurs_ vers des articles. Es-tu bien
sûr que c'est ce que tu veux ?
En général, on utilise plutôt un std::vector<TArticle> : l'intérêt de
la STL, c'est justement de ne pas à aller tripatouiller dans les
new/delete...


Hum ... pas d'accord. Si la classe est complexe, avec plein de champs,
sans constructeur sans arguments, opérateurs de recopie et autres moyens
de vérifier que l'objet manipulé est bien valide ... je fais comme lui.

Personnellement, j'utilise plus souvent des collections de pointeurs que
des collections de classes.

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>


Avatar
Michael Monerau
Luc Hermitte wrote:
Fabien LE LEZ wrote in
news::

On Mon, 28 Jul 2003 11:15:27 +0200, "Olivier" wrote:

je fait une collection d'article

(std::vector<TArticle *> _pCoArt;)


Ça, c'est une collection de _pointeurs_ vers des articles. Es-tu bien
sûr que c'est ce que tu veux ?
En général, on utilise plutôt un std::vector<TArticle> : l'intérêt de
la STL, c'est justement de ne pas à aller tripatouiller dans les
new/delete...


Hum ... pas d'accord. Si la classe est complexe, avec plein de champs,
sans constructeur sans arguments, opérateurs de recopie et autres
moyens de vérifier que l'objet manipulé est bien valide ... je fais
comme lui.

Personnellement, j'utilise plus souvent des collections de pointeurs
que des collections de classes.


Moi aussi, mais surtout pour le polymorphisme.
De toute façon, ce n'est pas bien compliqué de faire des delete (mais
fastidieux, je te l'accorde Fabien :) ).
--
<=-Michaël"Cortex" Monerau.-=>



Avatar
Christophe Lephay
"Olivier" a écrit dans le message de
news:3f24f839$0$24583$

J'ai regarde par rapport a la doc
quand c'est le dernier onfait un push_back non ?


Christophe Lephay a écrit dans le message :
bg2sg1$k3v$
"Olivier" a écrit dans le message de
news:3f24ea3a$0$24784$
if(i==max || max==1){
_pCoArt.push_back();
}else{
_pCoArt.erase(&_pArt);
}
delete _pArt;


Peut-être c'est mieux de faire le delete avant l'erase...

Par ailleurs, je comprends pas trop à quoi sert ton push_back...



j'ai lu ton post sur pop_back() plutôt que push_back(). Ceci dit, trois
choses :
1- évites le préfixe _ (c'est juste toléré dans les classes, mais à
déconseiller dune manière générale, ne serait-ce que parce que c'est dur à
prononcer, ce qui ne facilite pas les revues de code)
2- erase marche aussi pour effacer le dernier élément, il est donc inutile
de gérer ce cas de manière spécifique
3- tu ne peux plus accéder à l'élément d'un tableau si tu le supprimes.

Essaies donc de remplacer par le code suivant :

delete _pArt; // on supprime l'élément pointé
_pCoArt.erase( i ); // on supprime le pointeur, maintenant invalide, du
vector

Chris



Avatar
Fabien LE LEZ
On Mon, 28 Jul 2003 15:10:09 +0200, Luc Hermitte
wrote:

Hum ... pas d'accord. Si la classe est complexe, avec plein de champs,
sans constructeur sans arguments, opérateurs de recopie et autres moyens
de vérifier que l'objet manipulé est bien valide ... je fais comme lui.


Etant donné que l'op parlait d'une collection d'articles et pas de
pointeurs, et étant donné son niveau présumé (d'après son post),
j'estime que la question "Es-tu bien sûr que c'est ce que tu veux ?"
est légitime.

Personnellement, j'utilise plus souvent des collections de pointeurs que
des collections de classes.


Qu'entends-tu par "utiliser plus souvent" ? Généralement, dans mes
programmes, j'ai très peu de collections de pointeurs (et la plupart
du temps il s'agit de pointeurs qui se "deletent" eux-mêmes) et
beaucoup de collections d'objets, mais comme les quelques collections
de pointeurs ont un rôle fondamentale (par exemple, l'ensemble des
fenêtres et sous-fenêtres de mon application est une collection de
pointeurs en forme d'arbre, et la quasi-totalité du code est dans ses
fonctions membres), on pourrait aussi dire que "j'utilise plus souvent
des collections de pointeurs" ;-)


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Luc Hermitte
Fabien LE LEZ wrote in
news::

On Mon, 28 Jul 2003 15:10:09 +0200, Luc Hermitte
wrote:
Personnellement, j'utilise plus souvent des collections de pointeurs
que des collections de classes.


Qu'entends-tu par "utiliser plus souvent" ? Généralement, dans mes
programmes, j'ai très peu de collections de pointeurs (et la plupart
du temps il s'agit de pointeurs qui se "deletent" eux-mêmes) et
beaucoup de collections d'objets, mais comme les quelques collections
de pointeurs ont un rôle fondamentale (par exemple, l'ensemble des
fenêtres et sous-fenêtres de mon application est une collection de
pointeurs en forme d'arbre, et la quasi-totalité du code est dans ses
fonctions membres), on pourrait aussi dire que "j'utilise plus souvent
des collections de pointeurs" ;-)


J'ai surtout des collections de pointeurs (futés ou non). Il faut dire
que je donne très rarement une sémantique de copie à mes objets. Je sais
que techniquement cela pourrait simplifier des choses, mais vu leur
rôles, cela a rarement du sens -- sans parler des tous les problèmes
induits par le polymorphisme vis-à-vis de la duplication.
D'où au final des collections de pointeurs.

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>


Avatar
Fabien LE LEZ
On Tue, 29 Jul 2003 14:47:54 +0200, Luc Hermitte
wrote:

J'ai surtout des collections de pointeurs (futés ou non). Il faut dire
que je donne très rarement une sémantique de copie à mes objets


Je n'ai pas fait de statistiques sur mon code, mais j'ai l'impression
que plus un objet est petit, plus j'ai de collections de ce type
d'objets. Et les petits objets ont souvent une sémantique de valeur.

En particulier, j'ai dans mon code un sacré paquet de
std::basic_string<char>, de std::vector<int>, de std::map<int,int>,
etc. -- à tel point qu'en nombre de collections instanciées, les trois
que j'ai citées doivent représenter la grande majorité des collections
de mon code.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

1 2 3 4