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