OLP. Problèmes d'application - page 14

 
Yedelkin:

"Accès à un pointeur non valide" =="Tentative d'accès à un pointeur non valide" ? Si oui, alors

Un pointeur peut être invalide dans les cas suivants:

  • le pointeur est NULL;
  • si l'objet a été supprimé à l'aide de l'opérateur de suppression.

Le premier cas est le mien.

Je serais heureux d'utiliser CheckPointer() et d'autres méthodes de vérification (je ne suis pas né de la dernière pluie), mais démonter l'EA à partir du graphique ne me laisse aucune chance.

Si je comprends bien, si je spécifie dans le constructeur que le pointeur est égal à NULL et que j'arrête toute action avec ce pointeur, le conseiller expert obtiendra 281 et quittera (alors que selon mon idée, il ne devrait pas le faire).

Mais si vous appelez Init ou InitXXX après le constructeur (similaire à CExpert) , tout fonctionne correctement...

 
Interesting:

La première option est mon cas.

Je serais heureux d'utiliser CheckPointer() et d'autres méthodes de vérification (je suis né le même jour), mais le plantage de l'EA à partir du graphique ne me donne pas l'occasion de le faire.

Si j'ai bien compris, si je spécifie dans le constructeur que le pointeur est égal à NULL et que je casse toutes les actions possibles avec cela, EA obtient 281 et se divise (et selon mon idée, il ne devrait pas).

Mais si vous appelez Init ou InitXXX après le constructeur (similaire à CExpert) , tout fonctionne correctement...


Si vous aviez traité les exceptions, vous auriez pu facilement déterminer quel était le problème et le résoudre.
 
Interesting:

La première option est mon cas.

Je serais heureux d'utiliser CheckPointer() et d'autres méthodes de vérification (je crois que je ne suis pas né de la dernière pluie), mais démolir l'EA à partir du graphique ne me laisse aucune chance.

Si je comprends bien, si je spécifie dans le constructeur que le pointeur est égal à NULL et que j'arrête toute action avec ce pointeur, le conseiller expert obtiendra 281 et quittera (alors que selon mon idée, il ne devrait pas le faire).

Si vous appelez Init ou InitXXX après le constructeur (similaire à CExpert) , tout fonctionne comme il se doit...

Je n'ai pas encore eu affaire aux méthodes Init ou InitXXX, mais j'interpréterais "EA tirée vers le bas" en soi comme suit : le programme à l'exécution se heurte à un pointeur incorrect et nous devons chercher ce goulot d'étranglement dans le code. Mon constructeur initialise également un pointeur à NULL, mais rien ne sort.

Si j'ai mal compris la question, je suis désolé.

 
Interesting:

Merci, maintenant tout est à sa place. Mais, il y a une question supplémentaire - Supposons que l'erreur 281 se produise, mais qu'il est souhaitable que l'EA ne soit pas déchargée. Comment devons-nous le gérer ?

Permettez-moi de clarifier ma question : Que faire si l'erreur 281 se produit après toutes les étapes de l'initialisation, mais qu'elle n'affecte pas le travail principal du conseiller expert de manière suffisamment critique pour ne pas l'exécuter du tout ?

Il n'y aura pas de traitement des exceptions.

Il n'y a qu'une seule solution : ne pas utiliser de pointeurs incorrects.

S'il existe une possibilité (différente de zéro) qu'un pointeur soit incorrect, veillez à le vérifier avant de l'utiliser.

 
uncleVic:

Il n'y aura pas de traitement des exceptions.

La seule façon de s'en sortir est de ne pas utiliser de pointeurs invalides.

S'il existe une possibilité (autre que zéro) qu'un pointeur soit incorrect, veillez à le tester avant de l'utiliser.


Il y a TOUJOURS une possibilité (différente de zéro) qu'un pointeur soit invalide !

Vous devez donc toujours vérifier sa validité avant TOUTE utilisation ! Pas seulement après la création.

Pas toujours, mais c'est ce que je fais aux moments critiques :(


Oh merde, quel pur code transparent se transforme en :) en utilisant votre recommandation.

 
Yedelkin:

Je n'ai pas encore eu affaire aux méthodes Init ou InitXXX, mais j'interpréterais "sortir l'EA du tableau" en soi comme suit : le programme, au cours de son exécution , se heurte à un pointeur incorrect et c'est ce goulot d'étranglement dans le code qu'il faut rechercher. Mon constructeur initialise également un pointeur à NULL, mais rien ne sort.

Si j'ai mal compris la question, je suis désolé.

Si vous parlez de la classe CExpert, vous devez appeler au moins Init(...). Tous les pointeurs y sont initialisés comme des pointeurs vers des objets de classes de base...
 
falkov:

Il y a TOUJOURS une chance (différente de zéro) qu'un pointeur soit invalide !

Vous devez donc toujours vérifier sa validité avant TOUTE utilisation !

Pas toujours, mais dans les zones critiques, oui :(


Putain de merde, quel code transparent se transforme en :) en utilisant votre recommandation.

Alternative : Avoir un code transparent et propre qui s'envole sur un pointeur invalide ?
 
uncleVic:
Alternative : Vous avez un code propre et transparent qui échoue sur un pointeur invalide ?

Alternative : Avoir un code propre et transparent.

En cas de pointeur invalide et d'autres situations exceptionnelles (panne de courant, espace disque, etc. situations EXCLUSIVES), le programme passe au bloc de traitement des exceptions, où le respecté Intéressé (et moi aussi :) pourrait imprimer les valeurs des variables et l'erreur, analyser la situation et comprendre quel est le problème. Et, s'il n'y a pas de réaction à ce qui s'est passé dans ce bloc, on se casse.

Bien entendu, cela n'invalide pas les contrôles standard et nécessaires. Ceci est applicable UNIQUEMENT dans des SITUATIONS EXCEPTIONNELLES.

 
uncleVic:
Si c'est la classe CExpert, vous devez appeler au moins Init(...). Tous les pointeurs y sont initialisés comme des pointeurs vers des objets de classes de base...

Par exemple, si Init ou InitXXX est exécuté avec une erreur (renvoie faux), que se passe-t-il alors ?

Ou que faire si au moment de l'exécution l'EA reçoit toujours 281 (malgré tous les contrôles et astuces), mais qu'il n'y a pas de trader dans les parages ?

C'estun peu comme ça :

Si vous aviez géré les exceptions, vous auriez pu facilement trouver ce qui n'allait pas et gérer la situation.

Les contrôles sont là presque à chaque étape, mais malheureusement le traitement n'est pas là...

PS

Donc, à propos de l'abandon de l'EA dans le graphique - que faire pour rendre l'EA "vivant" dans toute initialisation ?

 
uncleVic:
Alternative : Pour avoir un code transparent et propre, se plantant par un pointeur invalide ?

Eh bien, c'est le point qui s'envole, laissez "moi" moi-même décider dans ce cas si l'expert doit être abattu ou non.

Après tout, nous ne parlons même pas d'un pointeur "cassé" appliqué quelque part, bien que j'aie personnellement un contrôle avant de l'appliquer (bien que je puisse implémenter un autre contrôle dans le minuteur).

J'ai appris à vivre en harmonie avec les indicateurs et je ne me soucie guère des résultats de l'initialisation, mais je ne peux pas me lier d'amitié avec les pointeurs.

Yedelkin:

Je n'ai pas encore eu affaire aux méthodes Init ou InitXXX, mais j'interpréterais le "rabattement de l'EA" en soi comme suit : au cours de son exécution , le programme se heurte à un pointeur incorrect et ce goulot d'étranglement doit être recherché dans le code. Mon constructeur initialise aussi un pointeur à NULL, mais rien ne sort.

Si j'ai mal compris la question, je m'en excuse.

Actuellement, afin de résoudre le problème, je renvoie 0 dans le bloc d'initialisation.

int OnInit()
{
//----------------------------------------------------------------------------//

//Processing process of the initialization

//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

Si j'ai bien compris, c'est la meilleure solution pour moi (pour que EA ne se plante pas à l'initialisation). C'est à dire que dans tous les cas le résultat OnInit = 0, je ne peux pas juger si c'est correct.