overloaded = function的问题

时间:2010-11-24 13:54:50

标签: c++

这是我的问题。

我有一个名为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;
}

由于

2 个答案:

答案 0 :(得分:2)

我倾向于责怪复制品(你没有展示)。如果在创建临时文件时复制字体,则第一个析构函数可能会调用loader->destroyFont(nativeFontPtr);。如果复制文件没有复制nativeFontPtr,则一旦临时范围超出范围,这将破坏单个基础字体。

答案 1 :(得分:0)

setFont的签名是什么?看起来你可能错过了AguiFont的拷贝构造函数。