Qt - QDrag执行的段错误
Qt - Segfault on QDrag exec
我目前正在做一个Qt 4.8.5和c++的项目。
我创建了一个名为ItemView的自定义Widget,并重新实现了拖放的方法。问题是,它在QDrag::exec()上出现分段错误。所以我试着在调试模式下编译,现在它工作了。
代码如下:
std::pair<AItem const *, unsigned int> *pair = new std::pair<AItem const *, unsigned int>(_item, _nb);
std::ostringstream oss;
oss << pair;
QDrag *dr = new QDrag(this);
QMimeData *data = new QMimeData;
data->setText(oss.str().c_str());
dr->setMimeData(data);
dr->exec();
这里是backtrace
#0 0x00007ffff4b33c6a in strlen () from /usr/lib/libc.so.6
#1 0x00007ffff7adc425 in XSetCommand () from /usr/lib/libX11.so.6
#2 0x00007ffff7ae0831 in XSetWMProperties () from /usr/lib/libX11.so.6
#3 0x00007ffff5cc9a07 in QWidgetPrivate::create_sys(unsigned long, bool, bool) () from /usr/lib/libQtGui.so.4
#4 0x00007ffff5c8142d in QWidget::create(unsigned long, bool, bool) () from /usr/lib/libQtGui.so.4
#5 0x00007ffff5c8997a in QWidget::setVisible(bool) () from /usr/lib/libQtGui.so.4
#6 0x00007ffff5cc0bcf in ?? () from /usr/lib/libQtGui.so.4
#7 0x00007ffff5cc1e15 in ?? () from /usr/lib/libQtGui.so.4
#8 0x00007ffff5c4c064 in QDrag::start(QFlags<Qt::DropAction>) () from /usr/lib/libQtGui.so.4
#9 0x000000000041d8da in ItemView::makeDrag (this=0x2e31db0) at src/Qt/Views/ItemView.cpp:155
#10 0x000000000041d9c3 in ItemView::mousePressEvent (this=0x2e31db0, mEvent=0x0) at src/Qt/Views/ItemView.cpp:66
#11 0x00007ffff5c8a4a1 in QWidget::event(QEvent*) () from /usr/lib/libQtGui.so.4
#12 0x00007ffff5c3b0dc in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /usr/lib/libQtGui.so.4
#13 0x00007ffff5c417dd in QApplication::notify(QObject*, QEvent*) () from /usr/lib/libQtGui.so.4
#14 0x00007ffff570bebd in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib/libQtCore.so.4
#15 0x00007ffff5c40f93 in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) () from /usr/lib/libQtGui.so.4
#16 0x00007ffff5cb2bab in ?? () from /usr/lib/libQtGui.so.4
#17 0x00007ffff5cb161c in QApplication::x11ProcessEvent(_XEvent*) () from /usr/lib/libQtGui.so.4
#18 0x00007ffff5cd8162 in ?? () from /usr/lib/libQtGui.so.4
#19 0x00007ffff2f4a296 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
#20 0x00007ffff2f4a5e8 in ?? () from /usr/lib/libglib-2.0.so.0
#21 0x00007ffff2f4a68c in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0
#22 0x00007ffff5738b25 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQtCore.so.4
#23 0x00007ffff5cd8216 in ?? () from /usr/lib/libQtGui.so.4
#24 0x00007ffff570ab1f in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQtCore.so.4
#25 0x00007ffff570ae15 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQtCore.so.4
#26 0x00007ffff570ff4b in QCoreApplication::exec() () from /usr/lib/libQtCore.so.4
#27 0x000000000042b041 in WindowManager::exec (this=this@entry=0x733b90) at src/Qt/WindowManager.cpp:66
#28 0x00000000004401c0 in Client::init (this=this@entry=0x729750, ac=ac@entry=1, av=av@entry=0x7fffffffe858) at src/Client.cpp:52
#29 0x0000000000414b04 in main (ac=1, av=0x7fffffffe858) at src/main.cpp:22
是否有一种方法使此工作在发布模式吗?
谢谢。
data->setText(oss.str().c_str());
将从临时字符串(即从setText返回后确定销毁)构建一个可能由char*
支持的新QString。之后,当你的程序试图操作这个字符串时,它会在发布时崩溃(因为它是无效的),但在调试时可能不会,因为编译器的诡计。
,而使用
data->setText(QString::fromStdString(oss.str()));
Ok找到解决方案了。我没有在我的主程序中创建QApplication,所以我必须在函数中通过引用传递argc。
相关文章:
- 为什么PyImport_ImportModule python 3.7.2 中出现段错误?
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 全局向量导致 C++ 程序结束时出现段错误
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 更改条件段错误
- 使用 TTF_RenderText() 加载字体时获取段错误 TTF_OpenFontRW()
- 注册对对象工厂的调用会导致段错误
- pthread_create在构造函数段错误中
- Nanoflann发现邻居提出段错误
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 具有unique_ptr的 CRTP 会导致段错误
- 增强纤维work_stealing屏障会导致段错误
- 当我返回指向结构的指针向量时出现段错误
- C++为什么我的代码没有爆炸/段错误?
- Pthread段错误,使用指向main中变量的指针
- C++ 模板中的段错误
- 相当于Windows/MSVC上的段错误?
- 为什么我的 LLVM JIT 实现出现段错误?
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?