考虑以下示例:
#include <wx/bitmap.h>
int main()
{
wxBMPHandler h;
wxImage::AddHandler(&h);
wxBitmap bm = wxBitmap(200, 200);
bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);
return 0;
}
因为我只使用h
来调用AddHandler()
而不是其他任何内容,所以我想避免完全定义它并将整个事情放在一行中。所以我想用以下方法取代它:
wxImage::AddHandler(&wxBMPHandler());
编译好的,但调用SaveFile()
将不起作用; WxWidgets将在运行时显示错误,指出“未定义类型1的图像处理程序”。
我猜在函数调用中创建的对象是临时的,但我不确定。如果没有,我错过了什么,以及如何避免定义h
?
值得注意的是AddHandler()
具有以下签名:
static void AddHandler( wxImageHandler *handler );
[更新] 回应M.M的评论说:
wxImage ::的AddHandler(安培; wxBMPHandler());应该无法编译,除非 该类已经超载了运算符&amp;对于右撇子
因为我找不到运营商和运营商的定义。在WxWidgets的源代码中,我创建了这个测试项目:
#include <iostream>
#include <string>
using namespace std;
string* address = nullptr;
void testing(string* input)
{
*input = "Something else entirely";
address = input;
}
int main()
{
testing(&string("Life is a test"));
cout << *address << endl;
cin.get();
return 0;
}
它编译得很好,没有任何“硬错误”运行 - 唯一需要注意的是屏幕上没有显示任何内容 - (*address).empty()
返回true。
我甚至定义了我自己的类来测试,而不是std::string
并产生相同的行为(没有编译器错误,没有运行时错误,但没有输出)。
我也按照aichao的建议尝试了这种单行程,但没有成功:
wxImage::AddHandler(shared_ptr<wxBMPHandler>(new wxBMPHandler()).get());
答案 0 :(得分:3)
我之前从未使用wxWidgets
,但根据wxWidgets version 3.1.1 API docs here,您应该使用堆分配的处理程序对象调用wxImage::AddHandler
:
wxImage::AddHandler(new wxBMPHandler);
因此,无需定义h
。同样根据文档,此处理程序对象的内存由wxWidgets
框架管理。具体来说,文档说handler
是
堆分配的处理程序对象,如果稍后由
wxImage
删除或在程序关闭时将被RemoveHandler()
删除。
还有静态成员函数wxImage::CleanUpHandlers()
来删除所有已注册的图像处理程序。根据文件:
此功能在退出时由wxWidgets调用。
因此,您不必自己删除处理程序,除非您特别想要(即释放一些内存)。
希望这有帮助。
答案 1 :(得分:1)
在wxImage::AddHandler(&wxBMPHandler());
中,表达式结尾的临时停止的生命周期,因此你有悬空指针。
在
wxBMPHandler h;
wxImage::AddHandler(&h);
wxBitmap bm = wxBitmap(200, 200);
bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);
h
超过了电话bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);
。
您将遇到与
类似的问题{
wxBMPHandler h;
wxImage::AddHandler(&h);
} // End of life time of h
wxBitmap bm = wxBitmap(200, 200);
bm.SaveFile("file.bmp", wxBITMAP_TYPE_BMP);