gpt4 book ai didi

c++ - 破坏 Glib::RefPtr 会导致 GTK 3 核心中的断言失败

转载 作者:可可西里 更新时间:2023-11-01 18:28:40 32 4
gpt4 key购买 nike

来自 Gtkmm 的人是 comparing Glib::RefPtrstd::auto_ptr<> :

Glib::RefPtr is a smartpointer. Specifically, it is a reference-counting smartpointer. You might be familiar with std::auto_ptr<>, which is also a smartpointer, but Glib::RefPtr<> is much simpler, and more useful.

但是由于某些奇怪的原因,我无法使用 RefPtr 完成我的工作。 .相同的代码适用于 auto_ptr .

在下面的代码中,SmartPtr只是这两个智能指针之一的占位符。

#include <gtkmm.h>
#include <iostream>
#include <tr1/memory>

struct WindowHolder {
SmartPtr<Gtk::Window> ptr;

WindowHolder()
: ptr(new Gtk::Window)
{
ptr->signal_delete_event().connect(sigc::mem_fun(*this, &WindowHolder::reset));
ptr->show_all();
}

bool reset(GdkEventAny* event)
{
Gtk::Main::quit();
}
};

int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
WindowHolder w;
kit.run();
}

编译时,我先定义SmartPtr作为Glib::RefPtr然后作为 std::auto_ptr .

$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-3.0` main.cc && ./a.out 
(main:22093): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed
$ g++ '-DSmartPtr=std::auto_ptr' `pkg-config --cflags --libs gtkmm-3.0` main.cc && ./a.out
$

问题是这个GLib-GObject-CRITICAL .在我的实际应用程序中,这不仅仅是一行,而是一大堆。在第二个版本中 std::auto_ptr一切都被破坏得很好。

奇怪的是在 GTK 2 中的代码很好:

$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-2.4` main.cc && ./a.out 
$

我不想依赖std::auto_ptr因为它已被弃用,而且我也不想使用原始指针,因为析构函数必须手动删除指针,这会增加额外的复杂性......

我的问题是:

  1. 原因 Glib::RefPtr这个“严重警告”(可能是双重免费)?
  2. 为什么它适用于 gtkmm 2.4 但不适用于 3.0?
  3. 我可以用 Glib::RefPtr 修复代码吗?和 gtkmm 3.0?
  4. 一般情况下我应该如何处理这种情况?

最佳答案

Glib::RefPtr 不适合一般用途。当 API 强制您使用它时,您应该使用它,否则就不要使用它。 GtkWindow(或 Gtk::Window)有自己奇怪的内存管理,这与 RefPtr 并不真正兼容。

如果你想要一个通用的智能指针,试试 std::shared_ptr 或 std::unique_ptr。或者你可以在 boost 中找到一些东西。

关于c++ - 破坏 Glib::RefPtr 会导致 GTK 3 核心中的断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10156565/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com