IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

Problème de (delete) pointeur


Sujet :

C++/CLI

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 74
    Points : 37
    Points
    37
    Par défaut Problème de (delete) pointeur
    Bonjour,

    La fonction suivante me pose problème.
    Comme vous pouvez le voir, j'ai plusieurs pointeur (wchar_t* et new wchar_t), mais, je n'arrive pas à les détruire.... le delete ne va pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    	private: System::Void bt_sbHelloParam_Click(System::Object^  sender, System::EventArgs^  e) {
     
    				typedef  wchar_t* (__stdcall *fct_sbHelloParam)(wchar_t* Input, wchar_t* Output);
    				fct_sbHelloParam fsbHelloParam;
     
    				fsbHelloParam = (fct_sbHelloParam)GetProcAddress(hInstLibrary, "_sbHelloParam");
    				if (fsbHelloParam){
    					IntPtr p =  System::Runtime::InteropServices::Marshal::StringToHGlobalUni(tbParam->Text->ToString());
    					wchar_t* Input = static_cast<wchar_t*>(static_cast<void *>(p));
    					wchar_t* Output = new wchar_t;
    					fsbHelloParam(Input, Output);		
    					this->tbLog->Text += "res="+gcnew String(Output)+ "\r\n";
    					delete Output;
    				}else{
    					this->tbLog->Text += "GetProcAddress for _sbHelloParam failed !" + "\r\n";
    				}
     
    		 }
    pouvez-vous m'aider ?

  2. #2
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Quelle erreur rencontres-tu ? A quel endroit du code ? ...

    D'autre part j'ai quelques remarques :
    - Input : tu n'as pas le droit d'appeler son destructeur ! Tu devrais passer par celui de p.
    - Output : tu n'as instancié qu'un seul caractère ... est-ce normal ?
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Comme le dis TheGzD, tu n'instancies qu'un seul charactère pour Output. A mon avis tu dois fournir un buffer suffisamment grand car "_sbHelloParam" doit écrire plusieurs charactères. Si c'est le cas, comme il écrit sur les octets directement après l'octet alloué, alors delete ne peut plus fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    wchar_t* Output = new wchar_t[XXX];
    ...
    delete[] Output;
    Il faut voir la documentation de "_sbHelloParam", pour connaître la valeur XXX.

    Il faut aussi libérer p avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System::Runtime::InteropServices::Marshal::FreeHGlobal(p);

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 74
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par moldavi Voir le message
    Bonjour.

    ... Si c'est le cas, comme il écrit sur les octets directement après l'octet alloué, alors delete ne peut plus fonctionner. ...

    ... Il faut voir la documentation de "_sbHelloParam", pour connaître la valeur XXX.
    C'est le cas.
    Je ne connais pas la valeur de XXX.
    Dans le cas du _sbHelloParam, il je pourrais éventuellement connaître cette valeur puisqu'il s'agit d'un paramètre écrit dans un textbox.

    Mais, j'ai une autre fonction similaire, pour laquelle la valeur retournée peut être différente en fonction du paramètre passé.

    PS: ces fonctions sont dans une DLL Delphi, .... il faudrait quoi d'après toi ? que je connaisse la taille max que peut retourner la DLL Delphi ?



    Citation Envoyé par moldavi Voir le message
    Il faut aussi libérer p avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
    Ok, Merci.

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Oui il faut connaître la taille minimum du buffer à fournir à la dll pour éviter un crash. J'imagine aussi qu'il faut initialiser le buffer avec des zéros, ça évitera peut-être des problèmes...

    En attendant tu peux toujours essayer des valeurs comme 256/512. Mais c'est risqué, enfin disons que cela dépend de ce que retourne cette dll.

Discussions similaires

  1. [version 8.1] problème de delete massif
    Par XPierrot dans le forum DB2
    Réponses: 6
    Dernier message: 12/01/2006, 16h01
  2. [VB]problème avec DELETE
    Par jogu dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/01/2006, 10h53
  3. Problème de DELETE
    Par WinZy dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 12h58
  4. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  5. Problème passage de pointeur
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 21/04/2004, 18h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo