j'ai une erreur qui se produit sur un delete et je ne comprends pas.
ma m=E9thode prends en param=E8tre une adresse email, celle-ci doit se
charger de l'=E9liminer d'une liste d'adresse email( celle-ci est un
membre de ma classe).
Seul dans le cas o=F9 l'adresse =E0 supprimer est en t=EAte de liste, la
m=E9thode ne plante pas.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabien LE LEZ
On 10 Aug 2005 04:43:07 -0700, "cyan" :
j'ai une erreur qui se produit sur un delete et je ne comprends pas.
Franchement, ton code me paraît trop compliqué pour avoir une chance de fonctionner. Et comme je n'ai aucune idée de l'endroit où se trouve le new qui va avec le delete, je ne risque pas de pouvoir t'aider.
Note par ailleurs que "delete" et "new[]" sont incompatibles -- delete[] va avec new[] et delete avec new. Ou plutôt, "delete" correspond à "new" et... c'est tout. AMHA, il se passera un sacré bout de temps avant que tu aies un usage légitime de new[].
Tu essaies apparemment d'utiliser des chaînes de caractères, mais en C, avec des char*. Dans le meilleur des cas, c'est pénible à écrire correctement, pénible à lire, pénible à maintenir. (Pour le pire des cas, remplacer "pénible" par "impossible".)
En C++, une chaîne de caractère, c'est un std::string. Pas de malloc, de new[] ou de delete[], pas de problème pour gérer la taille, ni de difficultés à copier.
D'autre part, j'ai l'impression que tu utilises une chaîne pour stocker une liste de chaînes séparées par un espace. Ce serait beaucoup plus simple de faire carrément un tableau de chaînes :
Si vraiment tu ne peux rien changer, au moins assure-toi que le paramètre ne sera pas modifié :
STDMETHODIMP COutlookEvents::modifyAddressees (CHAR* PARAM_email_account) { std::string email_account (PARAM_email_account); // suite de la fonction... }
On 10 Aug 2005 04:43:07 -0700, "cyan" <yann_chaysinh@yahoo.fr>:
j'ai une erreur qui se produit sur un delete et je ne comprends pas.
Franchement, ton code me paraît trop compliqué pour avoir une chance
de fonctionner.
Et comme je n'ai aucune idée de l'endroit où se trouve le new qui va
avec le delete, je ne risque pas de pouvoir t'aider.
Note par ailleurs que "delete" et "new[]" sont incompatibles --
delete[] va avec new[] et delete avec new.
Ou plutôt, "delete" correspond à "new" et... c'est tout. AMHA, il se
passera un sacré bout de temps avant que tu aies un usage légitime de
new[].
Tu essaies apparemment d'utiliser des chaînes de caractères, mais en
C, avec des char*. Dans le meilleur des cas, c'est pénible à écrire
correctement, pénible à lire, pénible à maintenir. (Pour le pire des
cas, remplacer "pénible" par "impossible".)
En C++, une chaîne de caractère, c'est un std::string. Pas de malloc,
de new[] ou de delete[], pas de problème pour gérer la taille, ni de
difficultés à copier.
D'autre part, j'ai l'impression que tu utilises une chaîne pour
stocker une liste de chaînes séparées par un espace.
Ce serait beaucoup plus simple de faire carrément un tableau de
chaînes :
Si vraiment tu ne peux rien changer, au moins assure-toi que le
paramètre ne sera pas modifié :
STDMETHODIMP COutlookEvents::modifyAddressees
(CHAR* PARAM_email_account)
{
std::string email_account (PARAM_email_account);
// suite de la fonction...
}
j'ai une erreur qui se produit sur un delete et je ne comprends pas.
Franchement, ton code me paraît trop compliqué pour avoir une chance de fonctionner. Et comme je n'ai aucune idée de l'endroit où se trouve le new qui va avec le delete, je ne risque pas de pouvoir t'aider.
Note par ailleurs que "delete" et "new[]" sont incompatibles -- delete[] va avec new[] et delete avec new. Ou plutôt, "delete" correspond à "new" et... c'est tout. AMHA, il se passera un sacré bout de temps avant que tu aies un usage légitime de new[].
Tu essaies apparemment d'utiliser des chaînes de caractères, mais en C, avec des char*. Dans le meilleur des cas, c'est pénible à écrire correctement, pénible à lire, pénible à maintenir. (Pour le pire des cas, remplacer "pénible" par "impossible".)
En C++, une chaîne de caractère, c'est un std::string. Pas de malloc, de new[] ou de delete[], pas de problème pour gérer la taille, ni de difficultés à copier.
D'autre part, j'ai l'impression que tu utilises une chaîne pour stocker une liste de chaînes séparées par un espace. Ce serait beaucoup plus simple de faire carrément un tableau de chaînes :
Si vraiment tu ne peux rien changer, au moins assure-toi que le paramètre ne sera pas modifié :
STDMETHODIMP COutlookEvents::modifyAddressees (CHAR* PARAM_email_account) { std::string email_account (PARAM_email_account); // suite de la fonction... }
Arnaud Meurgues
cyan wrote:
j'ai une erreur qui se produit sur un delete et je ne comprends pas.
Je pense que vous allez mieux comprendre si je vous pose la question suivante : Quelle est la taille du bloc mémoire que vous voulez libérer ?
found pointe au milieu d'un bloc mémoire. Il ne correspond donc pas à l'adresse d'un bloc alloué. Vous ne pouvez pas choisir de désallouer une partie d'un bloc mémoire. De plus, même si c'était possible, il n'y a aucun moyen de savoir quelle taille de bloc vous voulez désallouer (la désallocation ne s'occupe pas du contenu de ce qui est désallouer, et le fait qu'il y a un ' ' ne l'intéresse en rien).
Donc, on ne peut désallouer un bloc qu'avec l'adresse qui a été retrournée lors de son allocation, et c'est tout le bloc qui est désalloué. C'est pourquoi le delete ne plante pas lorsque l'adresse est en tête de liste : found est alors l'adresse de début du bloc.
Bref, ce qu'il faut faire, alors, c'est allouer un bloc de la bonne taille, y recopier ce que vous souhaitez garder, puis deleter l'ancien bloc (avec l'adresse de début de bloc, c'est-à-dire destinataire).
Un manière simple de faire serait d'itérer sur toutes les adresses de destinataire et de ne recopier dans le résultat que les adresses différentes de celle à supprimer. C'est un peu moins efficace (o(n) au lieu de o(n/2)), mais probablement beaucoup plus clair à lire, et ça couvre le cas où la même adresse serait présente deux fois.
-- Arnaud
cyan wrote:
j'ai une erreur qui se produit sur un delete et je ne comprends pas.
Je pense que vous allez mieux comprendre si je vous pose la question
suivante :
Quelle est la taille du bloc mémoire que vous voulez libérer ?
found pointe au milieu d'un bloc mémoire. Il ne correspond donc pas à
l'adresse d'un bloc alloué. Vous ne pouvez pas choisir de désallouer une
partie d'un bloc mémoire. De plus, même si c'était possible, il n'y a
aucun moyen de savoir quelle taille de bloc vous voulez désallouer (la
désallocation ne s'occupe pas du contenu de ce qui est désallouer, et le
fait qu'il y a un ' ' ne l'intéresse en rien).
Donc, on ne peut désallouer un bloc qu'avec l'adresse qui a été
retrournée lors de son allocation, et c'est tout le bloc qui est
désalloué. C'est pourquoi le delete ne plante pas lorsque l'adresse est
en tête de liste : found est alors l'adresse de début du bloc.
Bref, ce qu'il faut faire, alors, c'est allouer un bloc de la bonne
taille, y recopier ce que vous souhaitez garder, puis deleter l'ancien
bloc (avec l'adresse de début de bloc, c'est-à-dire destinataire).
Un manière simple de faire serait d'itérer sur toutes les adresses de
destinataire et de ne recopier dans le résultat que les adresses
différentes de celle à supprimer. C'est un peu moins efficace (o(n) au
lieu de o(n/2)), mais probablement beaucoup plus clair à lire, et ça
couvre le cas où la même adresse serait présente deux fois.
j'ai une erreur qui se produit sur un delete et je ne comprends pas.
Je pense que vous allez mieux comprendre si je vous pose la question suivante : Quelle est la taille du bloc mémoire que vous voulez libérer ?
found pointe au milieu d'un bloc mémoire. Il ne correspond donc pas à l'adresse d'un bloc alloué. Vous ne pouvez pas choisir de désallouer une partie d'un bloc mémoire. De plus, même si c'était possible, il n'y a aucun moyen de savoir quelle taille de bloc vous voulez désallouer (la désallocation ne s'occupe pas du contenu de ce qui est désallouer, et le fait qu'il y a un ' ' ne l'intéresse en rien).
Donc, on ne peut désallouer un bloc qu'avec l'adresse qui a été retrournée lors de son allocation, et c'est tout le bloc qui est désalloué. C'est pourquoi le delete ne plante pas lorsque l'adresse est en tête de liste : found est alors l'adresse de début du bloc.
Bref, ce qu'il faut faire, alors, c'est allouer un bloc de la bonne taille, y recopier ce que vous souhaitez garder, puis deleter l'ancien bloc (avec l'adresse de début de bloc, c'est-à-dire destinataire).
Un manière simple de faire serait d'itérer sur toutes les adresses de destinataire et de ne recopier dans le résultat que les adresses différentes de celle à supprimer. C'est un peu moins efficace (o(n) au lieu de o(n/2)), mais probablement beaucoup plus clair à lire, et ça couvre le cas où la même adresse serait présente deux fois.
-- Arnaud
Fabien LE LEZ
On 10 Aug 2005 04:43:07 -0700, "cyan" :
ma méthode prends en paramètre une adresse email, celle-ci doit se charger de l'éliminer d'une liste d'adresse email( celle-ci est un membre de ma classe).
Voici comment j'écrirais une telle classe :
class Bidule { public: void SupprimerAdresse (std::string const& adresse_a_supprimer);
if (it_adresse_a_supprimer == liste_adresses.end()) { // On vire l'adresse du tableau liste_adresses.erase (it_adresse_a_supprimer); } else { // L'adresse n'était pas dans le tableau } }
Note : ça paraît un peu long, mais c'est juste parce que j'ai tendance à employer des identifiants à rallonge. Ce qui n'est pas forcément un mal, d'ailleurs.
On 10 Aug 2005 04:43:07 -0700, "cyan" <yann_chaysinh@yahoo.fr>:
ma méthode prends en paramètre une adresse email, celle-ci doit se
charger de l'éliminer d'une liste d'adresse email( celle-ci est un
membre de ma classe).
Voici comment j'écrirais une telle classe :
class Bidule
{
public:
void SupprimerAdresse (std::string const& adresse_a_supprimer);
if (it_adresse_a_supprimer == liste_adresses.end())
{
// On vire l'adresse du tableau
liste_adresses.erase (it_adresse_a_supprimer);
}
else
{
// L'adresse n'était pas dans le tableau
}
}
Note : ça paraît un peu long, mais c'est juste parce que j'ai tendance
à employer des identifiants à rallonge. Ce qui n'est pas forcément un
mal, d'ailleurs.
ma méthode prends en paramètre une adresse email, celle-ci doit se charger de l'éliminer d'une liste d'adresse email( celle-ci est un membre de ma classe).
Voici comment j'écrirais une telle classe :
class Bidule { public: void SupprimerAdresse (std::string const& adresse_a_supprimer);
if (it_adresse_a_supprimer == liste_adresses.end()) { // On vire l'adresse du tableau liste_adresses.erase (it_adresse_a_supprimer); } else { // L'adresse n'était pas dans le tableau } }
Note : ça paraît un peu long, mais c'est juste parce que j'ai tendance à employer des identifiants à rallonge. Ce qui n'est pas forcément un mal, d'ailleurs.
if (it_adresse_a_supprimer == liste_adresses.end())
C'est pas !=, plutôt ?
{ // On vire l'adresse du tableau liste_adresses.erase (it_adresse_a_supprimer); } else { // L'adresse n'était pas dans le tableau } }
Par ailleurs, effectivement, pour deleter un tableau de char, c'est delete[] qu'il faut utiliser. Mais attention, si ce tableau a été alloué par malloc, alors il faut utiliser free et non delete[].
if (it_adresse_a_supprimer == liste_adresses.end())
C'est pas !=, plutôt ?
{
// On vire l'adresse du tableau
liste_adresses.erase (it_adresse_a_supprimer);
}
else
{
// L'adresse n'était pas dans le tableau
}
}
Par ailleurs, effectivement, pour deleter un tableau de char, c'est
delete[] qu'il faut utiliser. Mais attention, si ce tableau a été alloué
par malloc, alors il faut utiliser free et non delete[].
if (it_adresse_a_supprimer == liste_adresses.end())
C'est pas !=, plutôt ?
{ // On vire l'adresse du tableau liste_adresses.erase (it_adresse_a_supprimer); } else { // L'adresse n'était pas dans le tableau } }
Par ailleurs, effectivement, pour deleter un tableau de char, c'est delete[] qu'il faut utiliser. Mais attention, si ce tableau a été alloué par malloc, alors il faut utiliser free et non delete[].
-- Arnaud
Fabien LE LEZ
On Wed, 10 Aug 2005 14:47:51 +0200, Arnaud Meurgues :
if (it_adresse_a_supprimer == liste_adresses.end())
C'est pas !=, plutôt ?
Effectivement. C'était pour voir si tu suivais.
On Wed, 10 Aug 2005 14:47:51 +0200, Arnaud Meurgues
<news.arnaud@meurgues.non.fr.invalid>:
if (it_adresse_a_supprimer == liste_adresses.end())