C++ 重载=函数的问题

C++ 重载=函数的问题,c++,C++,这是我的问题 我有一门课叫AguiFont。它内部有一个指针,指向字体加载器设置为的任何字体类型。我重载了=操作符,这样用户就不必管理它的内存了 除了一种情况外,它工作得很好。当我在小部件的构造函数中设置字体时,由于某种原因,当我开始使用该字体时,我得到0xfefefe,这是由于该指针上的内存已经被释放。如果在main中的函数中,我创建一些字体并对它们进行class='d',这很好。当我调用someWidget.setFont()时也可以,但是调用setFont();在构造函数中,该问题是由 下

这是我的问题

我有一门课叫AguiFont。它内部有一个指针,指向字体加载器设置为的任何字体类型。我重载了=操作符,这样用户就不必管理它的内存了

除了一种情况外,它工作得很好。当我在小部件的构造函数中设置字体时,由于某种原因,当我开始使用该字体时,我得到0xfefefe,这是由于该指针上的内存已经被释放。如果在main中的函数中,我创建一些字体并对它们进行class='d',这很好。当我调用someWidget.setFont()时也可以,但是调用setFont();在构造函数中,该问题是由

下面是重载的=运算符:

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;
}
下面是一个小部件的构造函数:(我让它加载一个测试字体,它应该会成功)


谢谢

我倾向于责怪复制部门(您没有显示)。如果在创建临时文件时复制字体,则第一个析构函数可能会调用
loader->destrofFont(nativeFontPtr)。如果复制ctor没有复制nativeFontPtr,则一旦临时字体超出范围,就会立即销毁单个基础字体。

setFont的签名是什么?看起来可能是您缺少了AguiFont的复制构造函数。

您可能会觉得很有趣。@Konrad:什么意思?把我的评论转换成答案?我很确定我会因此而获得反对票:)@Fred:这就是我的意思。就我所知,在这种情况下,这是正确的答案。是的,它没有复制构造函数。我的复制构造函数应该是什么样子的,我不知道如何让两者一起工作。“三法则”:如果你需要一个复制构造函数、析构函数或赋值运算符,你可能需要这三个。但通常赋值运算符可以像
AguiFont tmp(源代码)一样简单;本->交换(tmp);归还*这个。这将重用复制ctor和交换函数。
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;
}