这是我的问题。
我有一个名为AguiFont的课程。它内部有一个指向字体加载器设置的任何字体类型的指针。我重载了=运算符,以便用户不必管理它的内存。
除了一种情况外,它的效果很好。当我在其构造函数中设置窗口小部件的字体时,出于某种原因,当我来使用该字体时,我得到0xfefefe,这是由于该指针的内存已被释放。如果在main中的一个函数中我创建了一些字体并且='d它们就没问题了。当我调用someWidget.setFont()时也很好,但调用setFont();在构造函数中导致问题。
这是overloaded =运算符:
AguiFont& AguiFont::operator=(const AguiFont &tmp)
{
loader->destroyFont(nativeFontPtr);
nativeFontPtr = 0;
if(tmp.getFont())
this->nativeFontPtr = loader->loadFont(tmp.getPath().c_str(),tmp.getSize());
this->fontLineHeight = tmp.getLineHeight();
this->fontPath = tmp.getPath();
this->fontSize = tmp.getSize();
return *this;
}
这是一个小部件的构造函数:(我已经加载了一个确实应该成功的测试字体)
AguiWidget::AguiWidget(void)
{
location = AguiPoint(0,0);
size = AguiSize(0,0);
parentWidget = 0;
dockingStyle = DockingNone;
userData = 0;
opacity = 1.0f;
setFont(AguiFont(std::string("test.ttf"),24));
tintColor = AguiColor(1.0f,1.0f,1.0f,opacity);
fontColor = AguiColor(0.0f,0.0f,0.0f,1.0f);
isWidgetVisible = true;
isWidgetEnabled = true;
isWidgetFocusable = false;
isWidgetTabable = false;
clipChildren = true;
}
由于
答案 0 :(得分:2)
我倾向于责怪复制品(你没有展示)。如果在创建临时文件时复制字体,则第一个析构函数可能会调用loader->destroyFont(nativeFontPtr);
。如果复制文件没有复制nativeFontPtr
,则一旦临时范围超出范围,这将破坏单个基础字体。
答案 1 :(得分:0)
setFont的签名是什么?看起来你可能错过了AguiFont的拷贝构造函数。