小编Man*_*lva的帖子

具有相同名称但在C++中具有不同成员的结构

按照书中的C++编程语言(Bjarne Stroustrup),在第15.2.3节(一个定义规则)第425页,我编写如下程序:

file1.cpp

struct S2 { int a; char b; };
Run Code Online (Sandbox Code Playgroud)

file2.cpp

struct S2 { int a; char bb; };
int main(){ return 0;}
Run Code Online (Sandbox Code Playgroud)

编译我试过下面的命令.

g++ -std=c++11 file1.cpp file2.cpp
Run Code Online (Sandbox Code Playgroud)

clang++ -std=c++11 file1.cpp file2.cpp
Run Code Online (Sandbox Code Playgroud)

这两个命令都生成可执行文件,没有任何错误或警告.但是按照书中这个例子应该给出错误.

c++ one-definition-rule undefined-behavior c++11

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

QApplication 后的清理

我正在将 Qt 桌面应用程序移植到 Linux(Ubuntu 19.10,64 位桌面,Qt 5.12.5,gcc 版本 9.2.1),并且在 QApplication 完成后我看到一些意外的线程保持活动状态。

这是最低限度的再现:

#include <QApplication>
#include <unistd.h>
int main(int argc, char * argv[]) {
    {
        QApplication app(argc, argv);
        sleep(1);
    }
    sleep(10);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在不同的时间点调试应用程序,我会看到以下内容:

  • 在运行 QApplication 的构造函数之前,正如预期的那样,只有一个线程,即主线程,存在。
  • 运行 QApplication 的构造函数后,会创建 4 个额外的线程:
    • QXcbEventQueue
    • 主界面
    • 总线
    • QDBusConnection
  • QApplication 的析构函数运行后,QXcbEventQueue 线程消失。
  • 即使在 10 秒的第二次睡眠完成后,除了主线程之外,其他 3 个线程仍然活着:
    • 主界面
    • 总线
    • QDBusConnection

在 QApplication 完成后,我正在寻找一种方法来正确结束这些线程(并进行我目前可能不知道的其他清理工作)(当然,在实际应用程序中,我调用 app.exec() 并执行其他东西)并已被销毁。

这不是应用程序本身的问题,在这 3 个线程仍然活着的情况下到达 main 的末尾似乎没有问题。

该应用程序是使用 Google Test 进行全面测试的更大的库/其他应用程序套件的一部分,这些测试包括一些死亡测试,如果在运行了一些涉及运行 QApplication 的测试后执行,则会抱怨分叉应用程序有多个线程,并且卡住并且永远不会完成,大概是因为这个原因。

关于我如何能够摆脱这些线程并在 QApplication 之后执行完全清理的任何提示?

linux qt multithreading googletest qapplication

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

'reinterpret_cast':无法使用boost.dll从'重载函数'转换为'intptr_t'

我正在使用Boost.dll在插件系统上工作

#include <boost/config.hpp>
#include <boost/dll/alias.hpp>
#include <memory>

class base {
public:
  base(){};
  ~base(){};
  template <typename T>
  static std::shared_ptr<base> create() {
    return std::make_shared<T>();
  }
  virtual void do1() = 0;
};

class derived : public base {
public:
  derived(){};
  ~derived(){};
  virtual void do1() override {}
};

BOOST_DLL_ALIAS(base::create<derived>, // <-- this function is exported with...
                create_plugin          // <-- ...this alias name
)

// auto a = base::create<derived>();
Run Code Online (Sandbox Code Playgroud)

当我尝试在BOOST_DLL_ALIAS宏中使用工厂方法时,出现如下所示的错误。

cl /c /ID:\Download\Compressed\boost_1_67_0 a.cpp

Microsoft (R) C/C++ Optimizing Compiler Version 19.12.25834 for x86 …
Run Code Online (Sandbox Code Playgroud)

c++ boost

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

std :: mutex作为类成员,并将类存储在容器中

下面是用于重现该错误的最少代码。

#include <iostream>
#include <mutex>
#include <vector>

class A {
    std::mutex mutex;
    public:
    A(){};
};
int main() 
{
    std::vector<std::pair<std::string,A>> aa;
    A a;
    //aa.push_back(std::make_pair(std::string("aa"),A()));
    //aa.push_back(std::make_pair(std::string("aa"),a));
    aa.push_back(std::make_pair(std::string("aa"),std::move(a)));    
}
Run Code Online (Sandbox Code Playgroud)

以下是错误。

用于x64的Microsoft(R)C / C ++优化编译器版本19.16.27026.1版权所有(C)Microsoft Corporation。版权所有。

>   C:\Program Files (x86)\Microsoft Visual
> Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\xlocale(319):
> warning C4530: C++ exception handler used, but unwind semantics are
> not enabled. Specify /EHsc    C:\Program Files (x86)\Microsoft Visual
> Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\utility(405):
> error C2440: '<function-style-cast>': cannot convert from 'initializer
> list' to '_Mypair'    C:\Program Files (x86)\Microsoft Visual
> Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\utility(405):
> …
Run Code Online (Sandbox Code Playgroud)

c++ mutex c++11

2
推荐指数
3
解决办法
135
查看次数

在鼠标挂钩中,滚轮增量始终为 0

#include <iostream>
#include <windows.h>

LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam){
  if(wParam == WM_MOUSEWHEEL){
    std::cout << "wheel: " << GET_WHEEL_DELTA_WPARAM(wParam) << std::endl;
  }else{
    MOUSEHOOKSTRUCT* mouselparam = (MOUSEHOOKSTRUCT*)lParam;
    std::cout << "etc: " << wParam << " - " << mouselparam->pt.x << "x" << mouselparam->pt.y << std::endl;
  }
  return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main(int argc, char *argv[]) {

    HHOOK hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, 0, 0);

    MSG msg;
    while (!GetMessage(&msg, NULL, NULL, NULL)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    UnhookWindowsHookEx(hhkLowLevelMouse);

    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ winapi

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

int main = 0,已编译但崩溃

我有一个非常简单的程序,如下所示。

int main = 0;

此程序a.c与文件编译的罚款gcc-4.8gcc-5gcc-6gcc-7gcc-8和应用程序执行时坠毁。

a.cppg++-4.8和编译的文件相同的程序可以正常运行,g++-5并且应用程序在执行时崩溃。但是在更高版本的g ++中,它会给出编译时错误。

以下是我的问题。

  1. 为什么a.cpp使用g ++-4.8和5可以正常编译,而不能用更高版本编译?它是在旧版g ++中出错还是在c ++标准中有所改进?
  2. 如果编译成功,那么为什么应用程序崩溃?

下面是详细的编译器和编译/执行输出。

+ gcc-4.8 --version
gcc-4.8 (Ubuntu 4.8.5-4ubuntu8) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

+ gcc-4.8 c.c
+ ./a.out
Segmentation fault      (core dumped) …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc g++

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