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++ Discussion :

Violation access memory


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut Violation access memory
    Bonjour tout le monde

    je suis dans un context de c++/cli, mais mon problème se situe au niveau d'un pointeur...

    je m'explique, j'ai un objet ManagedTest, qui contient un pointeur vers une autre objet NatifTest. NatifTest à une fonction : string GetString() (elle renvoie hello world). Mon objet ManagedTest à une fonction : string getNatifString() qui appel la fonction getString() de mon objet NatifTest.

    Le problème est que lorsqu'on arrive au return de NatifTest.getString() le compilateur me sort acces violation memory ou un truc du style. Et je ne comprend pas trop bien pourquoi

    Les bouts de class utile :
    Le constructeur de ManagedTest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private :
    	NatifTest *n;
     
    public:
    	ManagedTest(void)
    	{
    		*n = NatifTest();
    	}
    La fonction getNatifString de ManagedTest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String ^ ManagedTest::getMyNativeString()
    {
    	string s = n->getMyString();
    	return cppStr2NetStr(s);//ceci est un fonction qui converti std::string vers System.String de .net, elle fonctionne parfaitement bien
    }
    Le constructeur de NatifTest
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NatifTest(void)
    	{
    		myString = "Hello World !";
     
    		myInt = 5;
    	}
    la fonction getString de NatifTest
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string NatifTest::getMyString(void)
    {
    	return myString;
    }
    si quelqu'un pouvait me dire ce qui cloche, lorsque dans mon main j'appel la fonction monManagedTest.getNatifString(); ca m'enleverais une épine du pied

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    à mon avis t'as oublié un new dans ta fonction qui instancie l'objet Natiftest :
    je pense que ca serai plutot

    à la place de

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Je ne comprend pas trop la syntaxe de ton code ( peu etre a cause du cli ), mais si c est du C++, il me semble qu'il manque un new et qu'on ne deference pas a la creation:

    *n = NatifTest();

    devrait etre:

    n = new NatifTest();

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    En effet, le pointeur natif n n'était pas alloué (ni initialisé, mais je crois que le CLR initialise les variables membres à nullptr, même pour les pointeurs natifs).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 46
    Points
    46
    Par défaut
    bl4d3 à dit :
    ca veut dire quoi en terme de codage ?


    Après le travail, les vacances, après les vacances, le travail, etc.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    C'est une faute de frappe, le vrai terme est "déréférencer", qui signifie "aller voir ce qu'il y a à l'adresse pointée", donc lire ou écrire à l'adresse en question.

    C'est à ce moment qu'on a un comportement indéfini (si tu as de la chance, un crash) si le pointeur est invalide.

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut
    oki j'essairai ca demain, mais alors quel est la différence quand je ne fais pas le new, car si je fait NatifTest n = NatifTest(), si je me souviens bien ca devrait fonctionner... je me trompe peut etre...

    et puis j'avais pensé aussi a utilisé malloc pour allouer la mémoire mais la encore j'avais une erreur, quelqu'un sait pourquoi?

    Merci pour vos réponse

    Citation Envoyé par bl4d3
    Je ne comprend pas trop la syntaxe de ton code ( peu etre a cause du cli )
    si tu parles du ^, oui ça c'est du au cli, cela s'appel un handle, c'est ce qui fait la différence entre un objet managé, et non managé, quand tu as ^ après un type, c'est .net qui prend en charge la compilation sinon c'est le compilateur c++. (A ce que j'ai compris ... => je débute)

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut
    hihi ca fonctionne merci les gens

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Alloue suffisamment de mémoire pour un Natiftest, y crée un objet de type Natiftest, et fait pointer n sur cette mémoire nouvellement allouée.


    Crée un nouvel objet temporaire de type Natiftest, puis appelle l'opérateur= sur l'objet (*n ) de type Natiftest (ce qui implique que n doit pointer sur un tel objet, déjà construit) pour lui affecter la valeur du temporaire qu'on vient de créer.

    Donc les deux existent et peuvent être valides, mais signifient des choses différentes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cannot access memory
    Par kimikou dans le forum C
    Réponses: 2
    Dernier message: 19/04/2011, 08h53
  2. Violation access à l'adresse X
    Par Hypollite76 dans le forum Langage
    Réponses: 3
    Dernier message: 05/09/2007, 16h53
  3. DCOM Problem access memory
    Par metek dans le forum MFC
    Réponses: 7
    Dernier message: 08/08/2007, 11h38
  4. Réponses: 5
    Dernier message: 20/07/2006, 16h50
  5. [SIGBUS] Cannot Access Memory apres un Malloc?
    Par predacktor dans le forum C
    Réponses: 5
    Dernier message: 18/03/2006, 17h11

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