小编TCS*_*TCS的帖子

抛出抛出对象的复制构造函数 - 为什么还抛出抛出的对象?

请注意以下代码:

struct exception_in_copy_constructor
{
    exception_in_copy_constructor() = default;
    ~exception_in_copy_constructor() = default;
    exception_in_copy_constructor(const exception_in_copy_constructor& other) 
    { 
        throw std::exception(":-(");
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,很明显当我抛出这个对象时,会抛出一个std :: exception.

那么让我们看看下面的代码:

try
{    
    exception_in_copy_constructor ecc;
    throw ecc;
}
catch(exception_in_copy_constructor& ecc)
{
    printf("IN exception_in_copy_constructor&\r\n");
}
catch(std::exception& ex)
{
    printf("IN std::exception&\r\n");
}
Run Code Online (Sandbox Code Playgroud)

我希望之前的ecc会被抛出,std :: exception会被抛出,因此,ecc永远不会被抛出.上面的代码确认通过打印"IN std :: exception&"

但请注意这段代码:

try
{    
    exception_in_copy_constructor ecc;
    throw ecc;
}
catch(exception_in_copy_constructor& ecc)
{
    printf("IN exception_in_copy_constructor&\r\n");
}
Run Code Online (Sandbox Code Playgroud)

我希望没有任何东西会被抓住,但令我惊讶的是, catch(exception_in_copy_constructor& ecc)抓住了异常(?!?!)

谁能解释一下发生了什么?

我正在使用VS2015

谢谢!

编辑:用户写道他们无法重现,所以我正在编写整个代码,因为它在我的计算机上.另外,我使用的是VS2015,debug,x64(它还在发行版中重现).

这是代码:

int main()
{
    struct exception_in_copy_constructor
    {
        exception_in_copy_constructor() …
Run Code Online (Sandbox Code Playgroud)

c++ exception

5
推荐指数
0
解决办法
82
查看次数

运行regsvr32.exe时,带有线程句柄的WaitForSingleObject卡住了

我有线程A创建另一个线程B,而线程A正在等待使用WaitForSingleObject等待线程B死亡.

问题是即使线程B从线程的"thread_func"返回,线程A 也不会发出信号!.

我知道因为我在thread_func(线程B的主函数)的末尾添加了跟踪(OutputDebugString),我可以看到线程B完成了它的执行,但线程A永远不会从WaitForSingleObject中出来.

现在,我还必须补充一点,这个代码在一个COM对象中,当我调用regsvr32.exe(它被卡住了!)时,上面描述的场景正在发生,所以我相信线程A来自DLLMain.

任何想法为什么线程A没有得到信号?!?!

c++ winapi multithreading synchronization waitforsingleobject

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

Spidermonkey 字节码文档

我花了相当长的时间寻找所有蜘蛛猴字节码的文档,或者至少能告诉我字节码的一般用途是什么。

有人可以推荐这样的资源吗?

谢谢!

javascript firefox spidermonkey

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

为什么FindWindow找到一个EnumChildWindows没有的窗口?

我正在寻找一个窗口,其类名是"CLIPBRDWNDCLASS"(它可以在办公应用程序和其他应用程序中找到).

如果我使用FindWindow或FindWindowEx,我找到第一个具有此类的HWND,但我想要所有具有该类的窗口,所以我决定使用递归的EnumChildWindows来枚举所有窗口并找到我想要的窗口:

//-------------------------------------------------------------------------------
BOOL CALLBACK enum_wnd_proc(HWND h, LPARAM lp)
{
    char cls[1024] = {0};
    ::GetClassNameA(h, cls, 1024);

    if(std::string(cls) == "CLIPBRDWNDCLASS")
    {
        // match!
    }

    ::EnumChildWindows(h, enum_wnd_proc, NULL);

    return TRUE;
}
//-------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
    ::EnumWindows(enum_wnd_proc, NULL); 
    return 0;
}
//-------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

这是因为EnumWindows不会返回此窗口,只能通过FindWindow返回.

有谁能说出它为什么不起作用?

c++ windows winapi

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

使类型安全投入C++

这是一个理论问题,可以更好地理解异常的工作原理.

我需要检查什么才能确保我的课程安全?当我从堆栈的角度抛出异常时会发生什么?

例如,如果我在堆栈中创建一个对象,那么当我离开作用域时它应该被销毁,但是当我抛出该对象时会发生什么?这样做是安全的还是我必须在堆上创建对象?

非常感谢!

c++ exception-handling exception

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

_ctypes.cpython-39-x86_64-linux-gnu.so:未定义符号:使用 dlopen 加载的嵌入式 Python 中的 PyFloat_Type

我在 ubuntu 20.04 中使用嵌入式 Python (3.9) 并尝试导入产生错误的 ctypes _ctypes.cpython-39-x86_64-linux-gnu.so: undefined symbol: PyFloat_Type

我正在编译一个共享对象,它是使用 动态加载的dlopen()

CMake用于构建共享对象。我像这样声明 Python3 依赖关系: find_package(Python3 REQUIRED COMPONENTS Development Development.Embed)并使用链接target_link_libraries(${target_name} Boost::filesystem Python3::Python)

如果我理解正确,这会告诉 CMake 直接链接到libpython3.9.so(我也尝试明确声明链接到libpython3.9.so,但这并没有解决问题)。我确实看到libpython3.9.so有出口PyFloat_Type,但_ctypes.cpython-39-x86_64-linux-gnu.so没有看到。

导入只需通过以下PyRun_SimpleString()函数即可完成:PyRun_SimpleString("import ctypes")

我应该声明,我在网上看到了一些解决方案,但没有一个有效(例如导出LD_FLAGS="-rdynamic",但也没有帮助)。

我还应该指出,使用解释器(python3.9)导入效果很好。

以下是 CMake 生成的构建命令: /usr/bin/c++ -fPIC -g -Xlinker -export-dynamic -shared -Wl,-soname,mytest.python3.so -o mytest.python3.so CMakeFiles/mytest.python3.dir/[mydir]/[myobjects].o /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.71.0 /usr/lib/x86_64-linux-gnu/libpython3.9.so /usr/lib/x86_64-linux-gnu/libpython3.9.so

感谢您提前提供任何帮助!

python ubuntu ctypes python-embedding

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

句柄指向的结构

我试图找到有关 HANDLE 指向的结构的信息,但没有成功。例如, CreateFile() 返回一个 HANDLE (== void*),我认为它指向一个包含有关文件信息的结构。进程和线程以及每个 HANDLE 也是如此。

那么,在哪里可以找到有关 HANDLE 指向的结构的信息?

谢谢!:-)

c++ winapi internals

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

Elasticsearch 作为 DB 或 Elasticsearch over MongoDB

不确定这个问题属于这个“堆栈”,但我们开始......

我的用例是提供大量数据的全文搜索。新数据一直在添加。

我知道 Elasticsearch 的搜索速度很快,但我不知道 Elasticsearch 作为 NoSQL 数据库(仅存储数据)是否会比将数据存储在 MongoDB 中并使用 Elasticsearch 为 MongoDB 建立索引具有更好的性能。

提前致谢!

mongodb elasticsearch

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

go-micro 和 go-grpc 的区别

我已经构建了一个“go-micro”服务。据我了解,go-micro 使用 protobuf 来定义和创建消息结构并使用 gRPC 作为网络协议(我当然可能在这里错了)。

如果以上正确,那么插件“go-grpc”的用途是什么?

谢谢!

protocol-buffers grpc go-micro

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

使用类型作为字段时,为什么不能推迟不完整类型(前向声明)大小的计算?

在以下代码中:

class B;

struct A
{
   B* b; // <- why MUST be a pointer? Why size cannot be calculated later...?
}

struct B
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

据我了解,struct A 必须将 b 定义为 B*,因为编译器在计算 A 的大小时无法告诉 B 的大小。

我不明白的是,为什么编译器不能推迟计算,直到找到 B 的完整定义(正如程序员通过转发声明类所承诺的那样)

c++ forward-declaration

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