Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gtkmm:什么是Glib::RefPtr用例? 我用C++和GTKMM库编写了一个GTK3应用程序。_C++_Pointers_Gtkmm - Fatal编程技术网

gtkmm:什么是Glib::RefPtr用例? 我用C++和GTKMM库编写了一个GTK3应用程序。

gtkmm:什么是Glib::RefPtr用例? 我用C++和GTKMM库编写了一个GTK3应用程序。,c++,pointers,gtkmm,C++,Pointers,Gtkmm,在gtkmm文档中,通常使用返回Glib::RefPtr的create()静态方法初始化一些具体实例,如Gtk::Application、Gtk::Builder、Gtk::StatusIcon等。同时,子部件通常出现在堆栈上 这对我来说并不清楚: 是因为内存堆栈使用还是其他原因?目前我的代码中没有RefPtr。我用valgrind的massif工具检查了堆栈的使用情况,峰值使用量约为100KB。对我来说似乎不太低,但可比较的大小占用了相同的堆栈内存 我可以像应用程序myapp那样将所有实例都

在gtkmm文档中,通常使用返回Glib::RefPtr的create()静态方法初始化一些具体实例,如Gtk::Application、Gtk::Builder、Gtk::StatusIcon等。同时,子部件通常出现在堆栈上

这对我来说并不清楚:

  • 是因为内存堆栈使用还是其他原因?目前我的代码中没有RefPtr。我用valgrind的massif工具检查了堆栈的使用情况,峰值使用量约为100KB。对我来说似乎不太低,但可比较的大小占用了相同的堆栈内存
  • 我可以像
    应用程序myapp
    那样将所有实例都放在堆栈上,还是应该始终使用create()
  • 在这种情况下,指针提供了什么优势
是一种参考计数智能指针,早于
std::shared\u ptr
并执行相同的基本功能。它的用例类似——它允许多个对象共享一个对象的所有权,而不直接了解彼此

在您的特定示例中,图标可能会被共享,因为它在UI中的多个位置使用,并且您不希望维护同一图像数据的多个副本,如果有多个图标,可能会占用大量内存

应用程序
生成器
对象可能由程序中的多个对象(例如,不同的窗口或对话框对象)持有,因此只要其中一个对象仍在使用,引用计数就会保持每个对象的活动状态。这使得
应用程序
对象的这些用户不必知道可能使用共享
应用程序
对象的程序的所有其他部分。使用
应用程序
完成一个窗口时,它将销毁指向
应用程序
的智能指针。如果该窗口是最后一个所有者,这也会销毁
应用程序
对象,但除此之外,它对其他用户保持活动状态—所有这些都不会让您被破坏的窗口知道
应用程序是否存在。

是一个引用计数智能指针,它早于
std::shared\u ptr
并执行相同的基本功能。它的用例类似——它允许多个对象共享一个对象的所有权,而不直接了解彼此

在您的特定示例中,图标可能会被共享,因为它在UI中的多个位置使用,并且您不希望维护同一图像数据的多个副本,如果有多个图标,可能会占用大量内存

应用程序
生成器
对象可能由程序中的多个对象(例如,不同的窗口或对话框对象)持有,因此只要其中一个对象仍在使用,引用计数就会保持每个对象的活动状态。这使得
应用程序
对象的这些用户不必知道可能使用共享
应用程序
对象的程序的所有其他部分。使用
应用程序
完成一个窗口时,它将销毁指向
应用程序
的智能指针。如果该窗口是最后一个所有者,这也会销毁
应用程序
对象,但对于其他用户来说,它仍然是活动的——所有这些都是在销毁的窗口不知道
应用程序
是否存在的情况下发生的

  • 是因为内存堆栈使用还是其他原因?目前我的代码中没有RefPtr。我用valgrind的检查了stack的使用情况 massif工具的峰值使用量约为100KB。对我来说似乎不太低, 但可比尺寸[与RefPtr的示例][1]采用了相同的尺寸 堆栈内存
主要原因是GTKMM是一个在C++上编写的GTK+库的瘦包装器。GTK+中的大多数对象都是在堆上分配的(例如<代码> GTKApple < /COD>对象是使用函数创建的),并且被引用计数(手动、使用/功能)。换言之,这些对象已经共享指针语义,尽管在普通C中表示。因此,将C++中的那些对象表示为智能指针——GLYB::RepPtR在这种情况下是最有意义的。
  • 我可以像
    应用程序myapp
    那样将所有实例都放在堆栈上,还是应该始终使用create()
不,因为
Gtk::Application
构造函数受
保护,所以编译器不允许在堆栈上创建这些对象

  • 在这种情况下,指针提供了什么优势
我想情况正好相反。将这些对象保持在堆栈上不会带来任何好处,因为由gtkmm对象包装的Gtk对象本质上是共享指针

  • 是因为内存堆栈使用还是其他原因?目前我的代码中没有RefPtr。我用valgrind的检查了stack的使用情况 massif工具的峰值使用量约为100KB。对我来说似乎不太低, 但可比尺寸[与RefPtr的示例][1]采用了相同的尺寸 堆栈内存
主要原因是GTKMM是一个在C++上编写的GTK+库的瘦包装器。GTK+中的大多数对象都是在堆上分配的(例如<代码> GTKApple < /COD>对象是使用函数创建的),并且被引用计数(手动、使用/功能)。换言之,这些对象已经共享指针语义,尽管在普通C中表示。因此,将C++中的那些对象表示为智能指针——GLYB::RepPtR在这种情况下是最有意义的。
  • 我可以像
    应用程序myapp
    那样将所有实例都放在堆栈上,还是应该始终使用create()
不,因为
Gtk::Application
构造函数受
保护,所以编译器不允许在堆栈上创建这些对象

  • 指针提供了什么优势