按照书中的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)
这两个命令都生成可执行文件,没有任何错误或警告.但是按照书中这个例子应该给出错误.
我正在将 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 完成后,我正在寻找一种方法来正确结束这些线程(并进行我目前可能不知道的其他清理工作)(当然,在实际应用程序中,我调用 app.exec() 并执行其他东西)并已被销毁。
这不是应用程序本身的问题,在这 3 个线程仍然活着的情况下到达 main 的末尾似乎没有问题。
该应用程序是使用 Google Test 进行全面测试的更大的库/其他应用程序套件的一部分,这些测试包括一些死亡测试,如果在运行了一些涉及运行 QApplication 的测试后执行,则会抱怨分叉应用程序有多个线程,并且卡住并且永远不会完成,大概是因为这个原因。
关于我如何能够摆脱这些线程并在 QApplication 之后执行完全清理的任何提示?
我正在使用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宏中使用工厂方法时,出现如下所示的错误。
Run Code Online (Sandbox Code Playgroud)cl /c /ID:\Download\Compressed\boost_1_67_0 a.cpp Microsoft (R) C/C++ Optimizing Compiler Version 19.12.25834 for x86 …
下面是用于重现该错误的最少代码。
#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) #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) 我有一个非常简单的程序,如下所示。
int main = 0;
此程序a.c与文件编译的罚款gcc-4.8,gcc-5,gcc-6,gcc-7和gcc-8和应用程序执行时坠毁。
与a.cpp用g++-4.8和编译的文件相同的程序可以正常运行,g++-5并且应用程序在执行时崩溃。但是在更高版本的g ++中,它会给出编译时错误。
以下是我的问题。
下面是详细的编译器和编译/执行输出。
+ 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)