[C] Problème de libération mémoire \Visual C++

Problème de libération mémoire \Visual C++ [C] - C++ - Programmation

Marsh Posté le 19-10-2002 à 16:14:47    

Bonjour,
 
Quand je déroule mon prg en mode déboguage sous vc++ j'obtiens l'erreur suivante à la destruction d'une pile par l'intermédiare d'1 fct de dll importée. Cette même pile ayant été alloué par une autre fct de cette même dll :
 
User breakpoint called from code at 0x102124af
Vc++ s'arrête dans le if de la biblio. dbgheap.c - Debug CRT Heap Functions, après appel de free():
 

Code :
  1. /* forced failure */
  2.         if (!(*_pfnAllocHook)(_HOOK_FREE, pUserData, 0, nBlockUse, 0L, NULL, 0))
  3.         {
  4.             _RPT0(_CRT_WARN, "Client hook free failure.\n" );
  5.             return;
  6.         }
  7.         /*
  8.          * If this ASSERT fails, a bad pointer has been passed in. It may be
  9.          * totally bogus, or it may have been allocated from another heap.
  10.          * The pointer MUST come from the 'local' heap.
  11.          */


 
Une idée ?

Reply

Marsh Posté le 19-10-2002 à 16:14:47   

Reply

Marsh Posté le 20-10-2002 à 04:33:15    

[devin]
Tu as corrompu la pile avec un débordement mémoire dans ton programme.
[/devin]


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 20-10-2002 à 11:15:49    

Pourtant mon code semble bavure :
 
main.c :
 

Code :
  1. #include"sstack.h"
  2. sstack_t *ppile = static_stack_create(5);
  3. sstack_destroy(ppile);


C'est à l'appel de sstack_destroy(ppile) que VC++ me retourne l'erreur citée + haut.  
Au travers de quelques autres forums, j'ai trouvé d'anciens posts qui traitent du pb.  
1) Cela peut s'agir d'1 pointeur corrompu
2) free() refuse la libération du bloc mémoire car celui-ci à été alloué sur un autre tas.  
Je ne vois mon pb ni dans 1) ni dans 2) ???
La mémoire est bien alloué dans la même dll qui tente de la libérer donc dans le même tas.
???
 
Dll
sstack.h

Code :
  1. ...
  2. /* Library stack */
  3. struct static_stack_s;
  4. typedef struct static_stack_s sstack_t;
  5. ...
  6. /* Constructor */
  7. /*------------------------------------------------------------------*/
  8. /* Function : Create and Initializate a stack
  9. * arg : Size of stack  
  10. * exit: Pointer to the new stack
  11. * exit: NULL if allocation failed or size == 0
  12. /*------------------------------------------------------------------*/
  13. EXPORT sstack_t *static_stack_create(unsigned long size);
  14. ...
  15. /*------------------------------------------------------------------*/
  16. /* Function : Destroy a stack  
  17. * arg : stack   
  18. * exit: NULL -> OK
  19. /*------------------------------------------------------------------*/
  20. EXPORT sstack_t *sstack_destroy(sstack_t *pstack);


 
sstack.c

Code :
  1. #include<windows.h> /* DllMain() for dll creation */
  2. #include"sstack.h"
  3. ...
  4. /*
  5. * List Structure
  6. */
  7. struct static_stack_s {
  8. wdata_t *pawdata;   /* pointer to array of wrappers */
  9. unsigned long size;   /* size of wrappers array  */
  10. unsigned long count;  /* count of occupied wrapper */ 
  11. unsigned long itop;   /* index of top's wrapper  */ 
  12. };
  13. ...
  14. /*------------------------------------------------------------------*/
  15. /* Function : Create and Initializate a stack
  16. * arg : Size of stack  
  17. * exit: Pointer to the new stack
  18. * exit: NULL if allocation failed or size == 0
  19. /*------------------------------------------------------------------*/
  20. EXPORT sstack_t *static_stack_create(unsigned long size)
  21. {
  22. sstack_t *pstack = NULL;
  23. /* For stack initialization */
  24. static const struct static_stack_s sstack0 = {0};
  25.  
  26. if(size)
  27. {  
  28.  /* Stack allocation */
  29.  pstack = malloc(sizeof *pstack);
  30.  if(pstack)
  31.  {  
  32.   /* Initialization */
  33.   *pstack = sstack0;
  34.   /* ++size because stack starts at pstack->pawdata[1] */
  35.   pstack->size = size;  
  36.    
  37.   /* Array of wrappers allocation */
  38.   pstack->pawdata =  
  39.    malloc((++pstack->size) * sizeof *pstack->pawdata);
  40.   if(!pstack->pawdata)
  41.    /* Allocation failed */
  42.    pstack = NULL;
  43.  }
  44. }
  45. return pstack;
  46. }
  47. ...
  48. /*------------------------------------------------------------------*/
  49. /* Function : Destroy a stack  
  50. * arg : stack   
  51. * exit: NULL -> OK
  52. /*------------------------------------------------------------------*/
  53. EXPORT sstack_t *sstack_destroy(sstack_t *pstack)
  54. {
  55. sstack_t *ret = NULL;  
  56.  
  57. if(pstack)
  58. {
  59.  free(pstack->pawdata);
  60.  free(pstack);
  61. }
  62. return ret;
  63. }


 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed