_Block_Type_Is_Valid (pHead->nBlockUse) Erreur
J'ai été dans un nouveau projet, mais je rencontre un problème dont je ne vois pas pourquoi l'échec.
Quand je perfom cette ligne supprimer textY me donner l'erreur _Block_Type_Is_Valid (pHead->nBlockUse). Donc, ce que je fais mal?
C'est le code source:
Texte.h
#ifndef TEXT_H
#define TEXT_H
typedef boost::shared_ptr<Font> FontPtr;
class Text
{
public:
Text(FontPtr font, char *text)
{
str = new char[35];
this->font = font; str = text;
}
Text(const Text& cSource);
Text& operator=(const Text& cSource);
~Text();
.
.
.
.
private:
FontPtr font;
char *str;
GLuint texture;
GLfloat pos_x, pos_y, width, height;
};
#endif
Text.cpp
Text::Text(const Text& cSource)
{
font = cSource.font;
texture = cSource.texture;
pos_x = cSource.pos_x;
pos_y = cSource.pos_y;
width = cSource.width;
height = cSource.height;
int sizeString = 35;
if (cSource.str)
{
str = new char[sizeString];
strncpy(str, cSource.str, sizeString);
}
else
{
str = 0;
}
}
Text& Text::operator=(const Text& cSource)
{
delete[] str;
font = cSource.font;
texture = cSource.texture;
pos_x = cSource.pos_x;
pos_y = cSource.pos_y;
width = cSource.width;
height = cSource.height;
int sizeString = 35;
if (cSource.str)
{
str = new char[sizeString];
strncpy(str, cSource.str, sizeString);
}
else
{
str = 0;
}
return *this;
}
Text::~Text()
{
delete[] str;
}
De police.h
#ifndef FONT_H
#define FONT_H
class Font
{
public:
Font(TTF_Font *font, SDL_Color color)
{
this->font = font; this->color = color;
}
~Font();
.
.
.
private:
TTF_Font *font;
SDL_Color color;
};
#endif
Font.cpp
Font::~Font()
{
TTF_CloseFont(font);
}
CGameApplication.cpp
.
.
.
.
void CGameApplication::initializeApplicationFonts()
{
TTF_Font* font;
SDL_Color color;
font = TTF_OpenFont("test.ttf", 15);
color.r = color.g = color.b = 255;
GApp->addFont(font, color);
Text *text = new Text(GApp->getFonts().at(0), " ");
text->setTexture( CTextM->textToGLTexture(GApp->getFonts().at(0), text) );
text->setPosX(20); text->setPosY(20);
GApp->addText(new Text(*text));
Text *textY = new Text(GApp->getFonts().at(0), " ");
textY->setTexture( CTextM->textToGLTexture(GApp->getFonts().at(0), textY) );
textY->setPosX(80); textY->setPosY(20);
GApp->addText(new Text(*textY));
delete textY; //-----> This line crashes the program with that error
}
.
.
.
GameApp.h
#ifndef GAMEAPP_H
#define GAMEAPP_H
class GameApp
{
public:
GameApp(){
}
//~GameApp();
void addFont(TTF_Font *font, SDL_Color color) {
vFonts.push_back(FontPtr( new Font(font, color) ) ); }
vector<FontPtr> getFonts() { return vFonts; }
void addText(Text *text) {
vTexts.push_back(new Text(*text));}
private:
SDL_Surface *gameMainSurface;
vector<Image*> vImages;
std::vector<FontPtr> vFonts;
vector<Text*> vTexts;
vector<Tile*> vTiles;
Map *currentMap;
};
#endif
Donc je pense que le problème est que quand je vais détruire l'objet textY, le pointeur de la TTF_Font est détruit. Mais je ne suis pas sûr, parce que quand j'ai ajouter un objet Texte dans le vecteur-je utiliser un constructeur par copie donc les différents pointeurs obtenu copie sans problèmes.
- Avez-vous marcher jusqu'à la pile d'appel pour voir qui était le dernier appel dans votre code qui a causé l'échec de débogage? (Aussi, Raw Pointeurs dans des conteneurs STL! Mes yeux! 🙂 )
- Oui, c'est seulement un test alors que j'en œuvre des pointeurs intelligents dans tous les conteneurs STL. Je vais vérifier la pile des appels. Merci.
Vous devez vous connecter pour publier un commentaire.
Il suffit d'utiliser un
std::string
. Cette erreur signifie que vous doublez supprimé quelque chose, ou quelque chose comme ça, un problème que vous n'auriez pas si vous n'avez pas à gérer votre propre mémoire. Votre code est jonché de fuites de mémoire et d'autres bugs que vous n'aurez pas àstd::string
.auto_ptr
dans des conteneurs Standard. Ce problème va être résolu en C++11, mais en C++03, vous devrez utilisershared_ptr
- même si il n'y a qu'une seule référence.De ce que je peux voir, l'erreur a à voir avec la valeur par défaut ctor pour
Text
. Que vous prenez dans unchar*
pointeur, allouer de l'espace pour la chaîne, mais ne sont pas réellement copier letext
enstr
, mais il suffit d'attribuer le pointeur! Vous ne corriger dans la copie ctor bien. Maintenant, considérons l'exemple suivant:C++03 (pour assurer la compatibilité...) permet à des chaînes de caractères littérales (
"hi"
) de se lier à des non-constchar*
pointeurs, comme on le voit dans ce code. C++11, heureusement, fixe et que cela devrait en fait plus de la compilation. Maintenant, la suppression d'une chaîne littérale de toute évidence ne fonctionne pas, que la chaîne est placée dans la lecture-seule la section de la .exe et en tant que tel n'est pasdelete
mesure. Je suppose que c'est là votre erreur vient de, si vous instanciez unText
objet à partir d'une chaîne littérale.Noter que cela se produit également si vous le créer à partir d'un
char[]
créé sur la pile:comme le
Foo
allons maintenant essayer dedelete
une pile de objet.Un autre cas où ce qui pourrait se produire si vous double-supprimer un objet: