Bonjour,
Je souhaiterais pouvoir interdire l'utilisation de l'opérateur new à partir d'un certain moment dans mon code. Du coup, je me dis que de le redéfinir est la solution. Mais je ne vois pas comment.
Cordialement,
Julien.
Bonjour,
Je souhaiterais pouvoir interdire l'utilisation de l'opérateur new à partir d'un certain moment dans mon code. Du coup, je me dis que de le redéfinir est la solution. Mais je ne vois pas comment.
Cordialement,
Julien.
Si tu veux empêcher quelqu'un d'instancier une classe en particulier, il te suffit de déclarer les constructeurs en privé.
Si vraiment tu veux redéfinir new, c'est possible:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class C { public: void* operator new (size_t size, autres parametres); }
Bonjour,
A ta place, je passerais par une factory générique (enfin, en réalité à ta place, je réfléchirai 2 ou 3 fois de plus à savoir pourquoi je veux faire cette opération des plus étranges et voir ce qui peut être fait de bien plus belle manière à cette fin).
Par contre je laisse de côté les paramètres du constructeur (sûrement très simple à ajouter en C++11, moins sans ça je trouve).
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 class Factory { template<class T> static bool New(T*& t) { t = NULL; if (canConstruct()) { t = new T; return true; } return false; } template<class T> static bool NewArray(T*& t, unsigned int size) { t = NULL; if (canConstruct()) { t = new T[size]; return true; } return false; } // return false pour interdire la construction static bool canConstruct() { return true; } }; int* array; if (Factory::NewArray(array, 10)) { // manipulation de mon array[10] correctement créé delete[] array; }
Du coup je m'interdis aussi les déclarations sans pointeur.
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
Merci pour vos réponses.
Alors l'intérêt d'interdire une allocation mémoire dynamique est du au fait que l'on est dans un contexte de système embarqué. Il y a donc une étape de configuration au démarrage pendant laquelle les allocations sont autorisées, puis interdites par la suite (d'ou le "à partir d'un moment").
Julien.
Là, c'est une autre paire de manche.
Il s'agit d'interdire toute allocation dynamique, pas seulement celles de quelques classes.
Le mieux, c'est de spécifier ce comportement, et de taper sur tout développeur qui ne s'y soumet pas![]()
Oui voila, la difficulté est qu'il faut vraiment interdire tout type d'allocation dynamique. Je t'avouerai que j'avais pensé à ta solution =). Après bon effectivement sur des "petits" projets un simple mot peut suffire, mais pour de la programmation multi-sites (France, Angleterre, Chine, ...) il y aura toujours quelqu'un qui ne respectera pas cette règle
Julien.
Une spécification est un "commandement divin devant absolument être suivi sous peine de rejet du projet par le client". Spécifier, c'est donner un ordre qui ne peut pas être refusé.
Cela dit, l'interdiction posée bloque aussi l'utilisation des string, des collections, et des lazy-singletons et j'en passe.
Dans ce cas, tu peux tricher violemment, en imposant une redéfinition à la compilation de malloc et new via une macro. Je pense à -Dnew="null;exit(-1);//" ou -Dnew="null;throw 0;//" (ou la variante #define en forçant l'inclusion du .h le contenant par la spec)
Mais c'est probablement trop violent.
Mais si le problème est la taille mémoire, un gros paquets de variable aura le même effet qu'un new: l'encombrement.
Du coup, pour quelle raison veux-tu interdire totalement l'allocation dynamique?
Partager