attemp to free un pointer not allocated by malloc sauf que il l'est - C - Programmation
Marsh Posté le 29-04-2020 à 08:22:44
Affiche l'adresse obtenue à la sortie du calloc, et affiche la valeur contenue dans ta variable juste avant le free. Si la valeur a changé, tu as un écrasement mémoire quelque part.
edit :
Code :
|
Marsh Posté le 29-04-2020 à 10:40:52
StdDev(dPhaseShiftSamples+1,indice-1,&mean,&stdev);
Median(dPhaseShiftSamples+1,indice-1,&dPhaseShiftSamplesMean);
Pourquoi passer l'adresse avec un +1 et passer l'indice avec un -1
Par ailleurs, ça serait pas mal d'avoir tout le code (au moins la partie boucle).
Marsh Posté le 30-04-2020 à 12:51:11
Hello,
J'ai pas encore regardé si l'adresse change ou pas, j'essaie ça Lundi (chômage partiel cette semaine). En y repensant, que j'ai le crash, en débug je vois que l'adresse après le memset est du style 0x0000001. Avant que j'ajoute le memset l’adresse était plus "normale" mais pas fait gaffe si elle était modifiée.
Par contre je n'explique pas pourquoi l'adresse o(ou même le contenus) serais altéré. Normalement windows empèche d'autres variables de venir mettre le boxon et dans le code je viens n'y faire que de la lecture en dehors de cette ligne oO :
Code :
|
Je doit ajouter un check Timeout cet aprèm,je peu vous mettre le code complet de la boucle si vous voulez.
Le but de la fonction est de calculer un déphasage sur 2 types de signaux. J'ai voulu avoir un code générique en fonction des signaux. Comme ça en plus je peut le réutiliser dans d'autres programmes.
C'est sur les signaux d'un stator d'un moteur et du capteur de position du rotor.
Les signaux du stators ont une certaine forme et ceux du capteur de position une autre forme.
Je prends tout les déphasage sur les périodes "électriques" sur un tour mécanique. Ça donne un PERIODE2PROCESS à 6 et je prends un rab de 2 à cause des phases à l'origine suites aux débug.
La référence est la valeur médiane du signal. ça me permet de travailler en acquisition équivalent AC et de prendre le passage par 0 comme référence. (les max sont "écrêtés" et ne sont pas fiable)
le +1 / -1 : j'ai une table à 8 éléments mais seulement 6 utiles, le premier est toujours à 0.
Si je met le 0 dans l’écart type et la moyenne ça change tout le résultat.
J'ai des valeurs qui sont d'environ 30 000.
Marsh Posté le 30-04-2020 à 13:34:00
jungledede a écrit : Hello, |
Absolument pas. Windows te garantit que tu ne vas pas taper dans l'espace d'adressage d'un autre processus, mais dans ton propre processus, tu fais ce que tu veux. Tu peux faire un écrasement mémoire via une autre variable sans problème. Je te donne un exemple :
Code :
|
result :
|
J'ai écrasé la valeur de ce que j'ai alloué dans b en passant par la variable a
Je dis pas que c'est ce que t'as fait, en général , les écrasements mémoire sont plus subtils, mais le fait est que si ta valeur pointée a changé, c'est pas bon ^^
Pire, un écrasement de pile, et tu peux même pas debugguer avec un point d'arrêt car la pile est perdue.
Marsh Posté le 30-04-2020 à 13:43:39
Je pense à truc : tu ne vérifies pas que valeur retour de l'alloc de mémoire comme si tu partais du principe que ça serait forcément alloué. Il faut toujours vérifier que l'alloc a bien fonctionné
Marsh Posté le 30-04-2020 à 15:49:11
xilebo a écrit :
|
rufo a écrit : Je pense à truc : tu ne vérifies pas que valeur retour de l'alloc de mémoire comme si tu partais du principe que ça serait forcément alloué. Il faut toujours vérifier que l'alloc a bien fonctionné |
ok, je comprends un peut plus. ça confirme le subtile.
Surtout que j'ai pas encore compris la "recurrence" du crash. Des fois ça fonctionne, des fois non, mais quand ça marche pas c'est toujours sur un signal "bizarre" (du moins une forme trop éloigné d'une sinus. A par ne pas trouver les index qu'il faut je comprends pas encore le lien de cause à effet).
Je verrais lundis avec les debug supplémentaire ce que je peu trouver.
Après je suis pas vraiment programmeur de formation, je me démerde, mais des fois je sens bien que j'implémente des trucs qui sont pas les bonnes pratiques. (Typiquement ça ne fait que 15 jours que je typecast les malloc )
Pour le code entier:
Code :
|
Marsh Posté le 30-04-2020 à 17:28:06
je regarderai plus tard mais y a pas tout
déjà ça :
Code :
|
ca sert à rien de faire un memset juste avant un free.
edit : quand je dis y a pas tout, c'est le code complet ( le main, les autres fonctions qui manipulent tes tableaux ).
Marsh Posté le 30-04-2020 à 18:41:00
Tu pourrais pas mettre le ficheir en téléchargement qq part parce que sans l'indentation, c'est chaud à lire.
Déjà, y'a un truc qui me chose si j'ai bien vu : tu fais des déclarations de variables à l'intérieur de ton do...while. C'est aps une bonne idée car à chaque tour de boucle, tu redéclares
Marsh Posté le 30-04-2020 à 19:07:19
xilebo a écrit : je regarderai plus tard mais y a pas tout déjà ça :
ca sert à rien de faire un memset juste avant un free.
|
Le memset on l'a mis en "debug".
On voulais voir si il arrive bien à remettre à zéro le tableau avant le free. Et en point d’arrêt on est bien à 0.
Mais on est d'accord qu'il ne sert à rien et qu'ils seront supprimés quand ça sera fiable.
Tout le code est là. Il n'y a que les structures de stockage des points (DescripteurCourbe) qui sont global. Le reste ça passe dans le prototype.
Je regarde pour vous mettre le fichier en lien. Je dois avoir un login Github qui traine
Marsh Posté le 23-04-2020 à 19:37:07
Hello,
J'ai un soucis sur lequel je sèche et qui arrive au bout de mes compétences.
J'ai une fonctions qui utilise des tableaux de double (1D). ne connaissant pas la taille à la compil, je passe par des pointers.
J'allocate les pointer avec un calloc pour avoir une mise à zéro des vaelurs du tableau.
Mon code viens écrire des valeurs dedans en y accèdant comme un tableau normale.
Je viens de "lire" via des fonctions stdev et median mais je passe son adresse avec un +1.
Ensuite je viens le free.
On arrive au soucis. Par moment j'ai un non-fatal runtime error qui me dis que le pointer à free n'est pas allocated by malloc, calloc, ...
J'ai fait un memset juste avant de le free, il passe bien toute les case à 0, mais il pète en error quand meme de temps en temps.
Je ne comprends pas pourquoi des fois ça marche et des fois non.
NON-FATAL RUN-TIME ERROR: "Management_Measure.c", line 949, col 9, thread id 7672, function id 1: Attempt to free pointer to memory not allocated by malloc() or calloc().
Le code code qui utilise le tableau. (rien de plus. Plein de code autour pour faire des calul qui permettent de remplir cette variable et la traiter, mais tout les "accès" a la variables sont là.:
---------------
Monde de merde | Restez curieux