小编kro*_*bla的帖子

从析构函数抛出一个异常安全的vtable?

请考虑以下示例:

#include <csignal>

class A
{
public:
    virtual ~A() {}
    virtual void foo() = 0;
};

class B : public A
{
public:
    virtual ~B() { throw 5; } 
    virtual void foo() {}
};

int main(int, char * [])
{
    A * b = new B();

    try
    {
        delete b;
    }
    catch ( ... )
    {
        raise(SIGTRAP);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我一直认为(天真的我),当程序在这种情况下获得,进入catch部分,则对象B在这b点将会保留,因为它是相当合乎逻辑的例外,将有"取消"(如果编程安全)的析构函数的效果.但是当我试图在gdb中运行这个片段并且在catch部分中找到断点时,我看到B对象已经消失,只剩下一个基础对象,因为vtable看起来像这样:

(gdb) i vtbl b
vtable for 'A' @ 0x400cf0 (subobject …
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling

17
推荐指数
2
解决办法
752
查看次数

GDB远程协议:如何分析数据包?

我有:

  • 采用eCos OS的专有原型ARM板(基于Cortex-M3)
  • 该板具有编程的RedBoot引导加载程序
  • 串行线(RS-232)
  • ARM的GDB调试器(arm-eabi-gdb)
  • 主机操作系统是Windows/Cygwin和/或Linux(实际上,无所谓)

问题: GDB调试器无法通过串行线连接到目标.

我想要的是:嗅探GDB远程协议的数据包,以便查明目标上的GDB存根是否存活并运行.

详细信息: RedBoot可以选择将目标控件传递给内置GDB存根.我知道RedBoot还活着,我可以连接它并通过串行线发送命令.RedBoot手册说,可以通过键入$或+符号(实际上是GDB远程协议数据包的前缀)来切换到GDB存根.它似乎适用于我发送终端死亡的那些符号.但我不确定RedBoot是否使用GDB存根支持进行编译(不要问我为什么:-)).

然后,当我尝试使用我的GDB调试器连接到电路板时,我得到以下图片(在Windows上):

(gdb) target remote COM3
Remote debugging using COM3
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Ignoring packet error, continuing...
Run Code Online (Sandbox Code Playgroud)

端口是正确的,波特率也是如此.实际上,如果我尝试对另一个没有连接的串口做同样的输出,我会得到相同的输出.

我想知道的是GDB存根是否发回任何东西?

直觉上我想的可能

set verbose on
Run Code Online (Sandbox Code Playgroud)

会有所帮助,但GDB手册说它影响非常有限,我的情况超出了它.

也许可以使用宏来编译GDB调试器,从而启用调试日志记录?

gdb ecos

13
推荐指数
1
解决办法
4906
查看次数

类协程的一部分不是协程。为什么?

class Foo:
    async def foo(self, a):
        return a

async def bar(b):
    return b

asyncio.iscoroutinefunction(functools.partial(bar, 1)) # returns True, OK
asyncio.iscoroutinefunction(functools.partial(Foo().foo, 1)) # returns False, WHY???
Run Code Online (Sandbox Code Playgroud)

我需要找到一种方法将类中的协程包装成部分的,这样结果也是一个协程。我怎么做?

python python-3.x python-asyncio

7
推荐指数
1
解决办法
245
查看次数

QtQuick:如何覆盖窗口关闭事件?

我在Qt的经历大概是两周,如果我碰巧问了一个愚蠢的问题,请原谅.

我的程序使用基于QtQuick的GUI.我在main.cpp中初始化它

#include <QGuiApplication>
#include <QtQuick/QQuickView>

#include "VeryVeryImportantItem.h"

extern
int main(int argc, char * argv[])
{
    qmlRegisterType<VeryVeryImportantItem>("com.my.stuff", 1, 0, "VeryVeryImportantItem");

    QQuickView      quickView(QUrl("MyView.qml"));

    quickView.show();

    QGuiApplication app;

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

MyView.qml看起来像这样:

import QtQuick 2.1
import QtQuick.Window 2.1
import com.my.stuff 1.0

Item VeryVeryImportantItem {
    id : veryVeryImportantItem
    ...
}
Run Code Online (Sandbox Code Playgroud)

VeryVeryImportantItem.h如下:

#include <QtQuick/QQuickItem>

class VeryVeryImportantItem : public QQuickItem
{
    Q_OBJECT
public:
    Q_INVOKABLE void cleanup();
    ...
};
Run Code Online (Sandbox Code Playgroud)

而现在的问题.如何在我的根窗口/视图上拦截close事件,调用VeryVeryImportantItem :: cleanup(); 只有在那之后关闭申请?

我现在发现的是,它QQuickItem::window()可以给我指向我需要的窗口的指针,窗口有信号QQuickWindow::closing(QQuickCloseEvent *);,理论上我可以通过操纵给定的QQuickCloseEvent …

qt qml qtquick2

4
推荐指数
2
解决办法
5690
查看次数

vala:获取属性的便捷方式

我知道可以使用以下简单语法按名称设置基于 GLib.Object 的类的属性

obj["foo"] = bar;
Run Code Online (Sandbox Code Playgroud)

有没有办法以类似的方式获得财产的价值?以下构建似乎不起作用:

Bar bar = obj["foo"];
Run Code Online (Sandbox Code Playgroud)

Vala 返回错误:不允许调用 void 方法作为表达式

我知道可以按照下面的示例来完成,但我正在寻找更简洁的东西。

Bar bar;
obj.get("foo", out bar);
Run Code Online (Sandbox Code Playgroud)

vala

1
推荐指数
1
解决办法
108
查看次数

如何隔离两个同名的c ++类?

我有一个包含大量C++测试文件的项目.每个测试文件都声明一个这样的类:

// test1.cpp
...
class Foo { void bar() {...} };
...
Run Code Online (Sandbox Code Playgroud)

// test2.cpp
...
class Foo { void bar() {...} };
...
Run Code Online (Sandbox Code Playgroud)

等等.

在测试套件变得非常大并且Foo某些测试模块中的类内容变得不同之前,一切都很好.在联系方面出现问题.每个ELF文件中的类的方法被声明为公共弱(nm符号中的"W" )符号,并且它导致调用方法的错误实例,例如来自的tests1.cpp调用.Foo::bar()tests2.cpp

如何将一个实例class Foo与另一个实例隔离开来?

宣布课程__attributes__ ((visibility ("hidden")))没有帮助,符号仍然是公开的.

同样可以肯定的是我可以使用命名空间,但我更愿意避免使用此选项.

有任何想法吗?

c++ g++ elf

1
推荐指数
1
解决办法
68
查看次数

GObject:如何将属性重置为默认值?

我有一个GObject,它有一个GObject类型的属性.我知道我可以像这样设置这个属性:

g_object_set (G_OBJECT (my_object), "my-property", my_value_for_property, NULL);
Run Code Online (Sandbox Code Playgroud)

但是如何将属性重置为其默认值?可能这条线看起来很直观:

g_object_set_property (G_OBJECT (my_object), "my-property", NULL);
Run Code Online (Sandbox Code Playgroud)

但是如果我的默认值ob"my-property"是指向对象的非空指针呢?无论如何,这条线不起作用.看来我不能只传递NULLg_object_set_property()

1
推荐指数
1
解决办法
904
查看次数

vala:如何将void*转换为uint []?

我想调用Gdk.Pixbuf.from_data()构造函数,以便将来自GStreamer的视频帧包装成pixbuf.构造函数接受指向内存的指针uint8[].但是我有一个void *变量(Gst.Video.Frame.data[0])指向数据的开头.我知道uint8[]这不仅仅是一个指针,而是一种了解内存开始的位置以及它跨越多远的类型.但是因为Gdk.Pixbuf.from_data()它并不重要,因为函数的C签名只接受,const guchar *并且长度是从其他参数(如步幅和高度)推断出来的.

那么......我如何正确地将void *指针包装到uint[]数组中?

Video.Frame frame = {};
...
var pixbuf = new Gdk.Pixbuf.from_data((uint8[])frame.data[0], ...);
Run Code Online (Sandbox Code Playgroud)

上面的转换不起作用,因为vala生成C代码,该代码将数据复制memory到新创建的数组但长度不正确.首先,显然vala本身不知道void *点的长度,其次,我不需要任何复制,我只需要一个简单的转换.

vala

0
推荐指数
1
解决办法
284
查看次数

标签 统计

c++ ×2

vala ×2

ecos ×1

elf ×1

exception-handling ×1

g++ ×1

gdb ×1

python ×1

python-3.x ×1

python-asyncio ×1

qml ×1

qt ×1

qtquick2 ×1