C++ 11中自动生成特殊移动函数(构造函数和赋值运算符)的规则指定不能声明析构函数.据推测,如果你需要在破坏中做一些特别的事情,那么这一举动可能并不安全.
但是,对于多态中正确的析构函数调用,必须将基类的析构函数声明为虚拟(否则通过其基类的指针删除子类的实例将无法正确链接析构函数).
我假设,即使是一个空的析构函数也会阻止编译器自动生成一个特殊的移动函数.如:
class Base {
virtual ~Base() { }
};
Run Code Online (Sandbox Code Playgroud)
但是,您可以默认析构函数,如下所示:
class Base {
virtual ~Base() = default;
}
Run Code Online (Sandbox Code Playgroud)
问题1:这是否允许编译器自动生成特殊的移动函数?
但是,显式默认析构函数存在问题.至少在GCC 4.8.2的情况下,签名被隐式地改为noexcept.如:
class Base {
virtual ~Base() = default; // compiler changes to:
// virtual ~Base() noexcept;
}
Run Code Online (Sandbox Code Playgroud)
虽然我在析构函数中使用noexcept没有问题,但这会破坏以下"客户端"代码:
class Sub : public Base {
virtual ~Sub(); // this declaration is now "looser" because of no noexcept
}
Run Code Online (Sandbox Code Playgroud)
所以问题2更重要的是:有没有办法允许在C++ 11中自动生成特殊的移动函数,并允许正确的析构函数链接到子类(如上所述),所有这些都不会破坏子类("客户端")代码?
我正在使用SFML,我想将Qt Creator与它结合使用.当我手动编译时,我向链接器提供以下参数-lsfmlsystem -lsfmlwindow.
如果我使用Qt Creator和(我认为)QMake,我该怎么做?
我正在尝试使用我编写的库编译一个简单的测试应用程序.这在其他机器上编译并运行良好.
我在/ usr/lib上有libroller.so.我正在编译一个main.cpp:
g++ -g3 -Wall -I"../../" -lrt -lroller -o rap main.o
Run Code Online (Sandbox Code Playgroud)
它抱怨了许多错误,例如:
/....../main.cpp:51: undefined reference to `Log::i(char const*, ...)'
Run Code Online (Sandbox Code Playgroud)
但是,我知道这些存在于此:
nm -Ca /usr/lib/libroller.so | grep "Log::i"
00000000001f5d50 T Log::i(char const*, ...)
0000000000149530 W Log::i(std::string const&)
Run Code Online (Sandbox Code Playgroud)
两者都是64位:
file /usr/lib/libroller.so
/usr/lib/libroller.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
file main.o
main.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
Run Code Online (Sandbox Code Playgroud)
与GCC不同,ld找不到导出的符号......但它们就在那里!我很确定这些符号是定义的.同样的.so使用一些相同的符号与另一个.
编辑/答案:对象的顺序很重要.在库之前放置main.o是必要的.我猜测链接器没有未解决的符号要处理,直到它到达main.o - 这是其列表中的最后一个对象.我仍然有点困惑,为什么这个在其他机器上工作了好几个月......
我在ssh上设置了一个git服务器
http://blog.commonthread.com/post/1034988660/setting-up-a-git-server
但是,我仍然可以通过ssh访问服务器并查看服务器上的所有文件夹.你通常如何保护服务器,以便git用户无法离开主目录并可能造成损害?我读了一些关于chroot或jail的事情.或者将主目录的权限设置为700.我想知道实现某些安全性的最简单方法以及有关如何执行此操作的详细信息.这是在Centos Linux服务器上.
有没有办法拒绝命令行访问,同时仍然允许用户从git推/拉?
我想在只有当堆栈通过特定函数时抛出异常时才使用GDB.
我的用例是我有一个Thread类,其doRun()函数在一个新线程中被调用.该线程捕获任何冒泡的异常,但我希望能够在抛出异常(未捕获)时中断.
我知道GDB可以做"反向调试"(很棒的概念)所以这可能会被使用,但是我想要一些更通用的东西 - 事实上,我希望这个解决方案找到我的.gdbinit文件.
我有一个库,foo,我已经为它生成了一个静态对象(libfoo.a).
我有一个第二个库,bar,我为它生成了一个共享对象(libbar.so),它从libfoo.a中获取一些符号.
我有第三个图书馆,baz,我正试图链接到吧.在调用链接器时,我得到有关条形中缺少符号的错误(对应于foo中的符号).nm告诉我这些符号存在于libfoo.a中,但不存在于libbar.so中; 但是,libbar.so中的libfoo.a中有一些符号.
为什么不复制所有符号?