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

MFC et surcharge de new/delete

GamerFou2
GamerFou2
Niveau 7
21 janvier 2003 à 14:11:17

Dans une appli utilisant les MFC, je souhaiterai surcharger les opérateur "new" et "delete" ( pour utiliser mon propre gestionnaire de mémoire qui marche très bien en dehors d´une appli MFC).

Problème : lors du link j´obtiens ca :

nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" ( ??2@YAPAXI@Z) already defined in MemoryManager.obj
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" ( ??3@YAXPAX@Z) already defined in MemoryManager.obj

J´ai essayé a peu près tout ce que je pouvais pour tenter de résoudre ce problème mais rien à faire.

Quelqu´un aurait il une petit idée ?

PS : je suis obligé d´inclure <afxwin.h> sinon pas de CWinApp . ..

SuperDindon
SuperDindon
Niveau 8
21 janvier 2003 à 14:37:02

Aïïaïïaïïaïe!
Si l´opérateur a déjà été défini avec les mêmes arguments, ben je crois qu´il y a pas de solution, du tout. Sorry

GamerFou2
GamerFou2
Niveau 7
21 janvier 2003 à 14:43:01

Bah vi c´est ce que j´ai pu remarqué : ) mais j´espérais qu´il y aurait une solution à ce problème . .. vive les MFC, lol !

SuperDindon
SuperDindon
Niveau 8
21 janvier 2003 à 14:49:36

Il existe peut-être des alternatives à la MFC.
Je pense à Dev-C++ qui n´en fournit pas, quelques programmeurs bénévoles auraient donc pu en créer.

Passage
Passage
Niveau 10
21 janvier 2003 à 18:17:00

Je pense au contraire qu´il y a une solution.
Dernierement j´ai utilisé GDI+ sous MFC qui lui aussi refais une declaration de new et delete.

Mais pour cela :
Peut tu donner la declaration de ton new et l´appel que tu en fait... Pas tout le code STP.

GamerFou2
GamerFou2
Niveau 7
21 janvier 2003 à 18:53:28

Ok, mes prototypes sont les suivants :

void *operator new(size_t _sz);
void operator delete(void *_ptr);

et j´utilise des macros pour faire mes propres allocs/désalloc :

  1. define xpNew(_type) new ( _type)
  2. define xpDelete(_type) delete ( _type)

exemple :

ObjetBidon *blabla = xpNew(ObjetBidon);
xpDelete(blabla);

etc . ..

GamerFou2
GamerFou2
Niveau 7
21 janvier 2003 à 20:16:13

Bon j´ai une solution ( provisoire), je viens de mettre mes opérateurs new/delete dans un namespace . .. mais bon j´aimerai quand même savoir s´il existe une meilleure solution.

GamerFou2
GamerFou2
Niveau 7
21 janvier 2003 à 21:07:38

quand je disais "solution" ca voulait dire moyen d´éviter les erreurs lors du link... mais bon mes opérateurs ne sont bien sur toujours pas appelé par new ( puisque dans un namespace maintenant).

Alors Passage, j´attends de voir ce que tu me proposes, en croisant les doigts pour que ca marche : )

GamerFou2
GamerFou2
Niveau 7
22 janvier 2003 à 11:25:53

allez hop ! euh . .. up ! : )

Passage
Passage
Niveau 10
22 janvier 2003 à 11:37:56

Ben desolé j´arrive pas a reproduire ton probleme.

J´ai tout placé dans un seul fichier . ..

Voila le source . ...

  1. include "stdafx.h"

// apres je fais mes includes perso . ..
// . ...................................

  1. ifdef _DEBUG

// A cause de la Definition MFC du new qui
// m´ennuie en debug je la retire . .. Une
// piste pour toi peut etre
//#define new DEBUG_NEW

  1. undef THIS_FILE

static char THIS_FILE[] = __FILE__;

  1. endif

// apres j´ai du code mais rien de
// bien interresant . ............

// Voila la classe de test

class Bidon
{
public:
Bidon()
{
MessageBox(NULL,"Construit","OK",MB_OK);
}

~Bidon()
{
MessageBox(NULL,"Detruit","OK",MB_OK);
}

void *operator new(size_t t)
{
return malloc(t);
}

void operator delete(void *ptr)
{
free(ptr);
}
};

// Pis viennent tes defines

  1. define xpNew(_type) new ( _type)
  2. define xpDelete(Pointer) delete(Pointer)

// Pis un petit test
void ClassPrincipale::Test()
{
Bidon *Ptr = xpNew(Bidon);
XpDelete(Ptr);
}

// Tout ce compile et link bien . ...

Pour finir le stdafx est defini comme suit :

// Un peu de blabla de MFC

  1. define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
  1. include <afxwin.h> // MFC core and standard components
  2. include <afxext.h> // MFC extensions
  3. include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
  4. ifndef _AFX_NO_AFXCMN_SUPPORT
  5. include <afxcmn.h> // MFC support for Windows Common Controls
  6. endif // _AFX_NO_AFXCMN_SUPPORT

// pis le fin de blabla MFC . ...

Essaye la meme chose en partant de zero histoire de voir . ...

GamerFou2
GamerFou2
Niveau 7
22 janvier 2003 à 12:14:39

Ah vi mais il y a un petit détail que j´ai peut être oublié de mentionner. Les opérateurs new/delete que j´essaie de surchager ne sont pas ceux d´une classe quelconque. Mais les opérateurs "globaux".

Si tu sors de la classe la définition de ces opérateurs tu verras qu´il y a pb . ...

GamerFou2
GamerFou2
Niveau 7
22 janvier 2003 à 12:15:35

Les opérateurs new/delete que j´essaie de surchager ne sont pas ceux d´une classe quelconque

Ce que je souhaite faire c´est intercepter TOUTES les allocations . ..

Passage
Passage
Niveau 10
22 janvier 2003 à 14:52:01

Ah ! Bon alors j´y retourne...

Passage
Passage
Niveau 10
22 janvier 2003 à 15:11:55

Bon voila j´ai une premier solution de gros cochon.

Dans les option de l´edition des liens :
/force:MULTIPLE

Dans le programme d´exemple que je t´ai passé cela semble fonctionner ( deplace les new et delete pour qu´il soient global ) .

A tes risques et perils bien sur ( Cf la DOC et les avertissement de l´editeur de lien ) .
perso c´est po le genre de truc que je ferais.

Ben a bien y reflechir pourquoi pas faire deriver tout tes objet d´une classe d´allocation ( comme cela tu peux maitriser tes new et delete sans pour autant matter ceux des librairies et autres . .) Enfin bon, t´as surement de bonnes raison.

J´y retourne encore histoire de voir si l´on ne peux pas exclure plus facilement la lib qui t´ennuie.

Passage
Passage
Niveau 10
22 janvier 2003 à 15:18:06

A noter qu´avec ce que je viens de te donner tu n´interceptera pas les new effectué dans des classes ( comme ceux que j´ai proposé en premier lieu ) . Enfin . ...

GamerFou2
GamerFou2
Niveau 7
22 janvier 2003 à 15:33:03

Arf, merci encore pour ta patience : )
Pourquoi je dérive pas tout ? je le faisais au début, en partie, dériver les classes principales à partir d´un "BaseObject" mais il s´avère que toute autre alloc n´est pas interceptée par le Memory Manager ( 1 tableau de float par ex). Or j´en ai eu besoin à un moment donnée et du coup j´ai laissé le fonctionnement ainsi.

Donc je ne voudrais pas avoir à modifier toutes mes classes juste pour pouvoir utliser le MemMgr avec des MFC. Surtout qu´il ne m´est pas indispensable non plus dans cette appli, c´est juste un outil qui me sert bien pour mes moteurs de jeux et que je voulais récupérer dans cette appli.

Passage
Passage
Niveau 10
22 janvier 2003 à 16:11:37

L´astuce a mon avis n´est pas de surcharger le new dans ce cas la mais plutot d´essayer de hooker le malloc ! Arf on se met a sortir la grosse artillerie . ..
Cela permet d´intercepter tous les new fait ( qu´il soient definie dans des classe ou que cela soit le new global ) !

GamerFou2
GamerFou2
Niveau 7
22 janvier 2003 à 18:52:35

Ok, bon bin je crois que je m´en passerai pour ce qui est des applis MFC, le but n´était pas de réécrire un nouveau gestionniaire : )

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