CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C/C++] différence malloc - new

-MasterLink-
-MasterLink-
Niveau 6
21 février 2008 à 14:50:18

Salut

Je poste ici pour une petite question concernant une différence entre malloc et new.

Toujours dans le cadre de l'éditeur de niveau que j'espere un jour finir ( :p) ) , je voulais faire un tableau dynamique de SDL_Surface*. J'ais donc écrit : SDL_Surface **tableau = malloc(nombre*sizeof(SDL_Surface*));
Quand j'ais voulu compiler, j'ais recu un message d'erreur sur une conversion impossible entre un void* et un SDL_Surface**.
J'ais donc réessayé avec un new : SDL_Surface **tableau = new SDL_Surface*[nombre]; et la sa compile parfaitement.
Donc comme a mon habitude quand je ne comprend pas quelque chose, je regarde dans les tuto de Fvirtman, mais cette différence n'était pas répertoriée dans le chapitre "différence malloc-new".

Quelque lignes après, j'utilise la fonction realloc(), donc j'aimerais si possible garder la ligne avec le malloc() pour la déclaration du tableau dynamique.

Donc je poste ma question ici : pourquoi la ligne avec le malloc ne se compile pas?

Merci d'avance

godrik
godrik
Niveau 30
21 février 2008 à 14:56:48

La différence entre new et malloc est que new va appeler le constructeur d'un objet tandis que malloc va juste allouer la taille neccessaire pour stocker la donné. Il y a egalement des differences internes mais qui ne sont pas interessantes d'un point de vue fonctionnel.

ton problem lors de "SDL_Surface **tableau = malloc(nombre*sizeof(SDL_Surface*));" est juste un probleme de typage, comme signifier par ton compilateur.
en effet, malloc renvoie un void* et pas un SDL_Surface**. Typecaster l'expression suffira a faire fonctionner cette ligne.

PS: n'oublie pas que de la mémoire alloué avec malloc doit etre liberer avec free. Tandis que de la mémoire allouer avec new doit etre liberer avec delete ou delete[].

-MasterLink-
-MasterLink-
Niveau 6
21 février 2008 à 15:04:53

Arf oui, comme je n'avais jamais rencontré ce type d'erreur a la compilation auparavant j'avais completement zappé qu'il fallait caster.
Donc simple oubli de ma part.

Merci en tout cas :-d

Lapintade
Lapintade
Niveau 30
21 février 2008 à 15:55:23

et pour finir, le new utilise malloc en interne. Au final, il existe bien qu'un seul allocateur memoire.

godrik
godrik
Niveau 30
21 février 2008 à 16:04:07

"et pour finir, le new utilise malloc en interne. Au final, il existe bien qu'un seul allocateur memoire. "
Basiquement, sur un PC: oui.
Mais certaines personnes utilisent une surcharge de l'operateur new pour fournir une plus grande localité mémoire a certaines structures de données. Ou alors pour placer les données sur des bancs mémoire particulier dans les architectures a mémoire non homogène.

Lapintade
Lapintade
Niveau 30
21 février 2008 à 16:26:12

reste poli hein !

LGV
LGV
Niveau 28
21 février 2008 à 20:25:23

notez qu'on peut "casser" un "new" en ses 2 operations elementaires:

::operator new
new (void *) Ctor()

Lapintade
Lapintade
Niveau 30
21 février 2008 à 22:36:28

reste poli toi aussi !! :)

saleGauss
saleGauss
Niveau 9
22 février 2008 à 21:11:42

Roh My god, je plussois Lapintade, arretez de nous insulter :p
Bon autant le "casser le new" je vois à peu pres, autant le "placer les données sur des bancs mémoire particulier dans les architectures a mémoire non homogène" c'est pire que du japonais (et pourtant j'apprend le japonais ! :d)

Un jour, peut etre, moi aussi je serais trop fort :-) :-)

godrik
godrik
Niveau 30
23 février 2008 à 19:59:17

des details rapidement.
Il existe des machines multi processeurs a mémoire dites "non uniforme". Par exemple, la ram est physiquement associé a des processeurs.
Du fait, si du processeur B, je lit une donné sur la barrete de ram du processeur A, c'est beaucoup plus long que si je lis la donné sur la barrete de ram du processeur B.

Du fait, on peu avoir interet a placer soit meme les données que l'on alloue.

Il y a un peu la meme chose sur DS, toute la mémoire de la machine n'est pas disponible par les deux processeurs. Il y a un pool de mémoire (assez petit) qui n'est accessible que par le ARM9. Du fait, on peut avoir interet a allouer certaines donné dans cette mémoire la plutot que dans la mémoire centrale. (cependant, je ne l'ai jamais fait sur DS)

saleGauss
saleGauss
Niveau 9
23 février 2008 à 21:33:28

ha ok je comprend mieux là !
J'aurais jamais pensé que de telles choses existaient.
Tiens, je me coucherais moins bete ce soir :D
merci pour l'explication donc

-MasterLink-
-MasterLink-
Niveau 6
24 février 2008 à 22:56:30

Wouaw quand on voit sa on se dit qu'il y a encore du chemin a faire :p)

Sinon j'aurais une deuxieme question sur la libération de mémoire des tableaux dynamiques. Je crois avoir lu qu'il fallait d'abord libérer toutes les cases du tableau, puis le tableau lui meme, ce qui donnerait donc

for (i=0;i<nb_case;i++)
{
free(tableau[i]);
tableau[i] = NULL;
}
free(tableau);
tableau = NULL;

L'exemple était pour une matrice, mais pour un simple tableau, les deux derniere lignes suffisent-elles?

Derniere petite question : est-ce qu'on peut (ou est-ce qu'il faut) se servir d'un SDL_FreeSurface() de la même facon qu'un free() ?

godrik
godrik
Niveau 30
25 février 2008 à 11:10:18

il faut toujours liberer la mémoire avec la fonction associé a celle qui la allouer.
si on l'a alloué avec malloc, il faut desallouer avec free et pas autre chose.

pour ta question sur la libération, tout depend de comment ton tableau a été alloué..., il y a t'il un seul malloc ou un malloc puis une allocation pour chaque case ?

-MasterLink-
-MasterLink-
Niveau 6
25 février 2008 à 18:29:17

Il y a un malloc, puis autant de realloc que de ligne dans un fichier test.txt

Ok, donc si j'ais un tableau de SDL_Surface*, je supprime le tout avec free(), et on oublie SDL_Freesurface().

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment