begin process at 2010 03 22 09:01:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Base de données

 > 

Probleme de restitution de la mémoire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme de restitution de la mémoire

lundi 6 juin 2005 à 15:07:23 | Probleme de restitution de la mémoire

gergalp

à l'éxécution d'un programme, j'ai un probleme au moment de restituer la mémoire. j'arrive pas à trouver d'ou ca vient.... c'est compilé avec VS .NET 2002 en mode debug

c'est pour utiliser la fonction sqlite3_exec de la lib SQLite 3

/*
* structures de données en utilisant une liste chainée
*/
typedef struct sql_result_item
{
    char                   ** Rows;
    struct sql_result_item  * _next;
    struct sql_result_item  * _prev;
}sql_result_item;

typedef struct sql_result
{
    int               nColumns;
    char           ** Columns;
    sql_result_item * _first;
    sql_result_item * _last;
}sql_result;

/*
* duplication d'une chaine de caracteres
*/

char * strdup(const char * str)
{
    int i;
    char * ret;

    if(str == NULL)
    {
         return NULL;
    }

    for(i = 0; str[i]; i++);

    ret = malloc(sizeof(*str) * i);

    ret[i] = '\0';
    while(i)
    {
        i--;
        ret[i] = str[i];
    }

    return ret;
}

/*
* fonction de callback appelée lors du traitement de la requete SQL
*   Elle sert à mettre en forme les résultats
*/
int sql_query_callback(sql_result * result, int argc, char ** argv, char ** columnNames)
{
    int i;
    sql_result_item * item;

    item = malloc(sizeof(*item));
    item->_next = NULL;
    item->Rows = malloc(sizeof(*item->Rows) * argc);

    if(result->_first == NULL)
    {
        result->nColumns = argc;
        result->Columns = malloc(sizeof(*result->Columns) * argc);
        for(i = 0; i < argc; i++)
        {
            result->Columns[i] = strdup(columnNames[i]);
            item->Rows[i] = strdup(argv[i]);
        }
        result->_first = item;
        item->_prev = NULL;
    }
    else
    {
        for(i = 0; i < argc; i++)
        {
            item->Rows[i] = strdup(argv[i]);
        }
        item->_prev = result->_last;
        result->_last->_next = item;
    }
    result->_last = item;

    return 0;
}

/*
* et enfin, la fonction de restitution de la mémoire, celle qui pose probleme
*/
void sql_freeresult(sql_result * pDat)
{
    int i;
    sql_result_item * pItem;
    sql_result_item * pBuff;

    for(i = 0; i < pDat->nColumns; i++)
    {
        free(pDat->Columns[i]);
    }
    free(pDat->Columns);

    pItem = pDat->_first;
    while(pItem->_next)   
    {
        for (i = 0; i < pDat->nColumns; i++)
        {
            free(pItem->Rows[i]);
        }
        free(pItem->Rows);
        pBuff = pItem->_next;
        free(pItem);
        pItem = pBuff;
    }

    free(pDat);
}

VS .NET me renvoie:

Debug Error!

Program: H:\dev\sql_test\Debug\sql_test.exe

DAMAGE: after Notmal block (#351) at 0x00D86C58

apres, ca, il pointe la ligne 1154 du fichier dbgheap.c qui définit une partie de la fonction free() en mode debug:

        if (!(_crtDbgFlag & _CRTDBG_CHECK_ALWAYS_DF))
        {
            /* check no-mans-land gaps */
            if (!CheckBytes(pHead->gap, _bNoMansLandFill, nNoMansLandSize))
                _RPT3(_CRT_ERROR, "DAMAGE: before %hs block (#%d) at 0x%p.\n",
                    szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
                    pHead->lRequest,
                    (BYTE *) pbData(pHead));

            if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
                _RPT3(_CRT_ERROR, "DAMAGE: after %hs block (#%d) at 0x%p.\n",
                    szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
                    pHead->lRequest,
                    (BYTE *) pbData(pHead));  /* ligne 1154 */
        }

pendant la génération, j'ai 2 avertissements:

sql_test warning LNK4075: ' /EDITANDCONTINUE' ignoré à cause de la spécification '/INCREMENTAL:NO'
sql_test warning LNK4098: conflit entre la bibliothèque par défaut 'LIBCMTD' et les autres bibliothèques ; utilisez /NODEFAULTLIB:library

lundi 6 juin 2005 à 22:49:45 | Re : Probleme de restitution de la mémoire

vdust

Le code pointé après l'erreur est tout à fait logique. D'ailleurs, si tu remarques bien, c'est précisément ce code qui t'a envoyé le message d'erreur
_RPT3(_CRT_ERROR, "DAMAGE: after %hs block (#%d) at 0x%p.\n",
                    szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
                    pHead->lRequest,
                    (BYTE *) pbData(pHead));  /* ligne 1154 */

(ceci constitue une seule et même instruction (en fait, une macro))

Le problème ne semble pas venir de ton code. Seule solution restante (à moins d'un problème passé inaperçu ici (mais je ne vois vraiment pas)), ça vient d'un autre endroit du programme qui appelle ces fonctions.
Ce type d'erreur est typique de lorsque tu essaies de libérer une mémoire déjà libérée. C'est donc qu'elle l'a été quelque part. Le tout est de savoir où. Là, la solution la plus sûr (mais pas forcément la plus rapide) est de faire un débogage pas à pas et de vérifier à chaque étape le contenu des mémoires, pour savoir quand elles sont libérées (et de repérer quel est le 'free' qui provoque l'erreur dans ta fonction 'sql_freeresult', pour savoir ce qui pose problème). N'ayant pas le reste du code,  je ne peux t'en dire d'avantage.

++ et bon courage ^^

-- Virtual Dust --

lundi 6 juin 2005 à 23:42:49 | Re : Probleme de restitution de la mémoire

gergalp

oki, je vais voir ca.

thx



Cette discussion est classée dans : sql, item, result, phead, pitem


Répondre à ce message

Sujets en rapport avec ce message

connecter à une base de données Mysql via ODBC et C [ par boualiasma ] Salut, Je voudrais connecter à une base de données Mysql via ODBC à partir d'un programme C sous Visual Studio 2008 Windows. le nom de DSN est : pays_ connecter au Mysql via ODBC à partir d'un programme C sous Visual Studio 2008 Windows. [ par boualiasma ] Salut,Je voudrais connecter à une base de données Mysql via ODBC à partir d'un programme C sous Visual Studio 2008 Windows.J'ai Mysql version 4.0.15 ( Problème du connexion à BD Mysql dans un programme C [ par boualiasma ] Salut, - J'ai décidé de travailler avec easyphp puisque plus facile à créer des bases des données par rapport au Mysql server via lignes des commandes ListBox [ par algerianito ] salut a tous mon problème est le suivant, si j ai un listbox et je sélectionne un item , je veux que cet item monte en premiere position mais à condit sql server et dev c++ [ par cyberboy ] bonjour tout le monde, je devlope une petite application qui a pour but d'acceder a la base de donneé et de faire des mise a jours... mais voila, mon recupere les item d'une colonne de ma listview [ par majestic3 ] Bonjour a tous, comment faire pour recuperer tous les elements d'une colonne d'une listview et les enregistrer dans une variable Assertion Failed [ par TheReb ] Bonjour! Cela fait maintenant une journée que j'essaie de trouver le problème dans mon code, en vain. J'obtiens toujours l'erreur Assertion failed... REQUETES SQL [ par nasriyakouta ] COMMENT JE PEUT FAIRE LES REQUETES SOUS SQL SERVER 2000:UPDATE,SELECTION,DELETE,AJOUT.ET MERCI DE VOTRE AIDE. Prorpiété URL d'une icône raccourci internet ? [ par steph12358 ] Bonjour Voilà! j'essaye d'extraire les propriétés d'un raccourci internet mais je n'arrive pas à récupérer l'URL associée. La fonction ne me renvoie


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,437 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales