मैं एक नई परियोजना में काम कर रहा हूं लेकिन मुझे एक समस्या का सामना करना पड़ रहा है जिसे मैं नहीं देख सकता कि क्यों विफल हो रहा है।_Block_Type_Is_Valid (pHead-> nBlockUse) त्रुटि
जब मैं इस पंक्ति को perfom पाठ हटा देता हूं तो मुझे त्रुटि _Block_Type_Is_Valid (pHead-> nBlockUse) दें। तो मैं क्या गलत हूं?
इस स्रोत कोड है:
Text.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;
}
Font.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
तो मुझे लगता है समर्थक ब्लेम यह है कि जब मैं ऑब्जेक्ट टेक्स्ट को नष्ट करता हूं, तो TTF_Font को पॉइंटर नष्ट हो जाता है। लेकिन मुझे यकीन नहीं है क्योंकि जब मैं वेक्टर में ऑब्जेक्ट टेक्स्ट जोड़ता हूं तो मैं एक कॉपी-कन्स्ट्रक्टर का उपयोग करता हूं ताकि अलग-अलग पॉइंटर्स को बिना किसी समस्या के प्रतिलिपि मिल सके।
आप कॉल स्टैक को देखने के लिए जो अपने कोड का अंतिम कॉल कि डिबगिंग विफलता का कारण बना था चलना था: यदि आप किसी ऑब्जेक्ट डबल हटाना
एक अन्य मामले में जहां ऐसा हो सकता है? (इसके अलावा, एसटीएल कंटेनर में रॉ पॉइंटर्स! मेरी आंखें! :)) –
हां, यह केवल एक परीक्षण है जबकि मैं सभी एसटीएल कंटेनर में स्मार्ट पॉइंटर्स लागू करता हूं। मैं कॉल स्टैक की जांच करने जा रहा हूं। धन्यवाद। –