Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > Visual C++ > C++/CLI
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/08/2012, 15h25   #1
vin100H
Candidat au titre de Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 13
Points : 13
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 :
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 ?
vin100H est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2012, 16h08   #2
TheGzD
Membre Expert
 
Avatar de TheGzD
 
Homme Geoffrey Garcia
Ingénieur R&D / Doctorant
Inscription : avril 2007
Messages : 1 318
Détails du profil
Informations personnelles :
Nom : Homme Geoffrey Garcia
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Ingénieur R&D / Doctorant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2007
Messages : 1 318
Points : 2 316
Points : 2 316
Envoyer un message via MSN à TheGzD
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 [CODE] ... [/CODE]
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
Doctorant à l'EDSPI de Clermont-Ferrand, depuis 2011.
TheGzD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2012, 18h50   #3
moldavi
Membre Expert
 
Homme david
Responsable développement
Inscription : décembre 2003
Messages : 1 295
Détails du profil
Informations personnelles :
Nom : Homme david
Âge : 39
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Responsable développement
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2003
Messages : 1 295
Points : 2 116
Points : 2 116
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 :
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 :
1
2
 
System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
__________________
Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect
http://sourceforge.net/projects/mfnode/

http://jeux.developpez.com/faq/directx/?page=dshow
moldavi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2012, 08h09   #4
vin100H
Candidat au titre de Membre du Club
 
Inscription : août 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 74
Points : 13
Points : 13
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 :
1
2
 
System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
Ok, Merci.
vin100H est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2012, 15h40   #5
moldavi
Membre Expert
 
Homme david
Responsable développement
Inscription : décembre 2003
Messages : 1 295
Détails du profil
Informations personnelles :
Nom : Homme david
Âge : 39
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Responsable développement
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2003
Messages : 1 295
Points : 2 116
Points : 2 116
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.
__________________
Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect
http://sourceforge.net/projects/mfnode/

http://jeux.developpez.com/faq/directx/?page=dshow
moldavi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h02.


 
 
 
 
Partenaires

Hébergement Web