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

Visual C++ Discussion :

VirtualAlloc pour remplacer un new


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut VirtualAlloc pour remplacer un new
    Bonjour tout le monde !
    J'essaie de remplacer un new[] dans mon programme par un VirtaulAlloc(), mais ça ne fonctionne pas.
    Je m'explique !
    Le new[] de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer = new short[size];
    J'essaie de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer=(short *)VirtualAlloc(0,size,MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE)
    L'allocation se passe bien, mais quand j'essaie d'écrire :
    J'ai une exception, qui me dit que je n'ai pas le droit d'écrire...

    Je pense que c'est lié au fait que size est spécifié en byte, et que donc il faudrait ajouter un sizeof(short), mais ça me fait la même chose (à une adresse deux fois plus grande !)...

    Qu'est-ce que j'ai oublié ?
    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    normal ,size doit tenir compte du type de donnée...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    buffer=(short *)VirtualAlloc(0,size*sizeof(short),MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE)

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Eh bien justement, non, ça ne fonctionne pas...
    J'ai remplacé VirtualAlloc par un GlobalAlloc pour voir, et cette fois, aucun soucis...
    L'appel est identique (je passe dans les deux cas size*sizeof(short))...

    Quelle différence y a-t-il donc ?
    Au passage, dans l'ordre des vitesses, quel est le meilleur appel ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    new[]
    VirtualAlloc
    GlobalAlloc
    LocalAlloc
    HeapAlloc
    Peut-être d'autres ?

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    exemple MSDN:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    // A short program to demonstrate dynamic memory allocation using 
    // a structured exception handler. 
     
    #include <windows.h>
    #include <stdio.h>              // for printf
    #include <stdlib.h>             // for exit
     
    #define PAGELIMIT 80            // ask for this many pages
     
    LPTSTR lpNxtPage;               // address of the next page to ask for
    DWORD dwPages = 0;              // count of pages gotten so far
    DWORD dwPageSize;               // the page size on this computer
     
    INT PageFaultExceptionFilter(DWORD dwCode)
    {
      LPVOID lpvResult;
     
      // If the exception is not a page fault, exit.
     
      if (dwCode != EXCEPTION_ACCESS_VIOLATION)
        {
          printf("Exception code = %d\n", dwCode);
          return EXCEPTION_EXECUTE_HANDLER;
        }
     
      printf("Exception is a page fault\n");
     
      // If the reserved pages are used up, exit.
     
      if (dwPages >= PAGELIMIT)
        {
          printf("Exception: out of pages\n");
          return EXCEPTION_EXECUTE_HANDLER;
        }
     
      // Otherwise, commit another page.
     
      lpvResult = VirtualAlloc(
                         (LPVOID) lpNxtPage, // next page to commit
                         dwPageSize,         // page size, in bytes
                         MEM_COMMIT,         // allocate a committed page
                         PAGE_READWRITE);    // read/write access
      if (lpvResult == NULL )
        {
          printf("VirtualAlloc failed\n");
          return EXCEPTION_EXECUTE_HANDLER;
        } else {
          printf ("Allocating another page.\n");
        }
     
      // Increment the page count, and advance lpNxtPage to the next page.
     
      dwPages++;
      lpNxtPage += dwPageSize;
     
      // Continue execution where the page fault occurred.
     
      return EXCEPTION_CONTINUE_EXECUTION;
    }
     
    VOID ErrorExit(LPTSTR lpMsg)
    {
      printf ("Error! %s with error code of %ld\n",
              lpMsg, GetLastError ());
      exit (0);
    }
     
    VOID main(VOID)
    {
      LPVOID lpvBase;               // base address of the test memory
      LPTSTR lpPtr;                 // generic character pointer
      BOOL bSuccess;                // flag
      DWORD i;                      // generic counter
      SYSTEM_INFO sSysInfo;         // useful information about the system
     
      GetSystemInfo(&sSysInfo);     // initialize the structure
     
      printf ("This computer has page size %d.\n", sSysInfo.dwPageSize);
     
      dwPageSize = sSysInfo.dwPageSize;
     
      // Reserve pages in the process's virtual address space.
     
      lpvBase = VirtualAlloc(
                         NULL,                 // system selects address
                         PAGELIMIT*dwPageSize, // size of allocation
                         MEM_RESERVE,          // allocate reserved pages
                         PAGE_NOACCESS);       // protection = no access
      if (lpvBase == NULL )
        ErrorExit("VirtualAlloc reserve failed");
     
      lpPtr = lpNxtPage = (LPTSTR) lpvBase;
     
      // Use structured exception handling when accessing the pages.
      // If a page fault occurs, the exception filter is executed to
      // commit another page from the reserved block of pages.
     
      for (i=0; i < PAGELIMIT*dwPageSize; i++)
        {
          __try
            {
              // Write to memory.
     
              lpPtr[i] = 'a';
            }
     
          // If there's a page fault, commit another page and try again.
     
          __except ( PageFaultExceptionFilter( GetExceptionCode() ) )
            {
     
              // This code is executed only if the filter function is 
              // unsuccessful in committing the next page.
     
              ExitProcess( GetLastError() );
     
            }
     
        }
     
     
      // Release the block of pages when you are finished using them.
     
      bSuccess = VirtualFree(
                    lpvBase,       // base address of block
                    0,             // bytes of committed pages
                    MEM_RELEASE);  // decommit the pages
     
      printf ("Release %s.\n", bSuccess ? "succeeded" : "failed" );
    }

Discussions similaires

  1. [VBA-E] rechercher une ligne pour remplacer?
    Par zouille dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/12/2005, 10h31
  2. Souci pour remplacer les Retours chariot par <BR>
    Par ahage4x4 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 01/06/2005, 11h24
  3. TEXT ou VARCHAR(255) pour remplacer un TINYTEXT MySQL
    Par Invité dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2005, 12h01
  4. Quel SGBD choisir pour remplacer Access ?
    Par ggl'Nouveau dans le forum Décisions SGBD
    Réponses: 11
    Dernier message: 17/11/2003, 10h21

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