OVH Cloud OVH Cloud

strange problem

6 réponses
Avatar
Flzw
Ca fait pas longtemps que j'utilise les containers da la libraire standard
mais sur ma derniere app j'ai pas eu de probleme

La je commence un autre projet et j'ai eu un probleme avec std::string,
quand je depassais une chaine de 16 caracteres ( a priori c'est la taille
allouée par defaut ) ca lancait un bad_alloc automatiquement

j'ai essayé reserve(), pareil, je recupere un bad_alloc sur le reserve

J'ai ensuite essayé reserve() sur un vector, et, meme erreur...

Je ne sais pas du tout ce qui fait ca et ca fait un moment je m'enerve la
dessus, si quelqu'un aurait une petite idée....

6 réponses

Avatar
drkm
"Flzw" writes:

[...]

Je ne sais pas du tout ce qui fait ca et ca fait un moment je
m'enerve la dessus, si quelqu'un aurait une petite idée....


Étrange. Pourrais-tu poster un bout de code minimal reproduisant le
problème ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
Flzw
Étrange. Pourrais-tu poster un bout de code minimal reproduisant le
problème ?


Merci mais en fait j'ai finalement compris.

Le probleme venait j'utilisais une classe que j'ai codé dans une DLL et en
fait j'avais décidé de declarer la classe avec juste les fonctions exportées
dans le header de mon app (et donc sans les variables)

Ca marchait a la compilation mais comme les 2 classes etaient pas déclarées
pareil ca corrompait la stack et faisait foirer tout les appels suivant a
new etc.

Je pensais que l'on pouvait declarer la classe avec juste les methodes
publiques et que le compilateur se debrouillerait ( et ca allait dans le
sens de ce que dit Bjarne dans son livre) mais comme la representation en
memoire et forcément pas la meme...

bref je sais pas si je suis tres claire, mais en rajoutant les variables
membres de ma classe dans le header pour mon app, ca marche nickel.

Avatar
drkm
"Flzw" writes:

Le probleme venait j'utilisais une classe que j'ai codé dans une DLL
et en fait j'avais décidé de declarer la classe avec juste les
fonctions exportées dans le header de mon app (et donc sans les
variables)

Ca marchait a la compilation mais comme les 2 classes etaient pas
déclarées pareil ca corrompait la stack et faisait foirer tout les
appels suivant a new etc.


Ca s'appelle une violation de l'ODR.

Je pensais que l'on pouvait declarer la classe avec juste les
methodes publiques et que le compilateur se debrouillerait


Non.

( et ca
allait dans le sens de ce que dit Bjarne dans son livre) mais comme
la representation en memoire et forcément pas la meme...

bref je sais pas si je suis tres claire, mais en rajoutant les
variables membres de ma classe dans le header pour mon app, ca
marche nickel.


Si je comprend bien, ta classe est définie dans deux fichiers
différents ? C'est très déroutant, et très dangereux. Comme le
montre ton exemple, si j'ai bien compris.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
Flzw
Si je comprend bien, ta classe est définie dans deux fichiers
différents ? C'est très déroutant, et très dangereux. Comme le
montre ton exemple, si j'ai bien compris.


Ben je suis bien obligé car je dois rajouter l'attribut
__declspec(dllexport)

dans les declarations des fonctions membres de la classe dans la dll.

A moins qu'il y est une autre facon de faire ?

Avatar
Loïc Joly
Flzw wrote:
Si je comprend bien, ta classe est définie dans deux fichiers
différents ? C'est très déroutant, et très dangereux. Comme le
montre ton exemple, si j'ai bien compris.



Ben je suis bien obligé car je dois rajouter l'attribut
__declspec(dllexport)

dans les declarations des fonctions membres de la classe dans la dll.

A moins qu'il y est une autre facon de faire ?


La manière "classique" est de faire un truc du genre

#ifdef JE_COMPILE_LA_DLL
#define DECLARE_DLL __declspec(dllexport)
#else
#define DECLARE_DLL __declspec(dllimport)
#endif

C'est pas très joli, une macro, mais j'ai pas grand chose de mieux à
proposer.
Autre avantage : Le jour où on compile sous Linux, il suffit de définir
cette macro à rien du tout.

--
Loïc


Avatar
Serge Paccalin
Le lundi 30 août 2004 à 01:41, Flzw a écrit dans fr.comp.lang.c++ :

Si je comprend bien, ta classe est définie dans deux fichiers
différents ? C'est très déroutant, et très dangereux. Comme le
montre ton exemple, si j'ai bien compris.


Ben je suis bien obligé car je dois rajouter l'attribut
__declspec(dllexport)

dans les declarations des fonctions membres de la classe dans la dll.

A moins qu'il y est une autre facon de faire ?


Avec une macro qui changera de valeur selon le projet qui inclut le
fichier .h :

///////////////////////////////////////////
// Machin.h

#if ! defined(DECL_MACHIN_EXPORT)
#define DECL_MACHIN_EXPORT __declspec(dllimport)
#endif

class DECL_MACHIN_EXPORT Machin
{
// ...
};

///////////////////////////////////////////
// Machin.cpp

#define DECL_MACHIN_EXPORT __declspec(dllexport)
#include "Machin.h"

Machin::Machin()
{
//...
}

//...

///////////////////////////////////////////
// Autre .cpp "client"

#include "Machin.h"

Machin unMachin;

//...


Par ailleurs, si tu veux masquer tes données membres, documente-toi sur
le "pimpl idiom", tu m'en diras des nouvelles.

--
___________ 2004-08-30 10:24:26
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763