在使用g ++的独立上下文(没有标准库,例如在操作系统开发中)中,会出现以下现象:
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
~Derived() {}
};
int main() {
Derived d;
}
Run Code Online (Sandbox Code Playgroud)
链接时,它表示如下: undefined reference to operator delete(void*)
这显然意味着即使动态内存分配为零,g ++也会生成删除运算符的调用.如果析构函数不是虚拟的,则不会发生这种情况.
我怀疑这与课堂生成的vtable有关,但我不完全确定.为什么会这样?
如果由于缺少动态内存分配例程而不能声明删除操作符,是否有解决方法?
EDIT1:
为了成功地重现g ++ 5.1中的问题,我使用了:
g ++ -ffreestanding -nostdlib foo.cpp
二进制编码的十进制指令至少来自i8086是x86架构的一部分.它们类似于AAA,DAA,AAS,DAS,并且有助于处理BCD数字的算术运算.
以下是它们的一些参考:
https://en.wikipedia.org/wiki/Intel_BCD_opcode
根据英特尔软件开发人员手册.这些指令在长(64位)模式下不可用.我知道也许唯一真正知道为什么是建筑设计师的人,但为什么你认为他们删除它们?
Windows API有一个名为EnableWindow禁用控件的函数,因此用户无法再与它们进行交互.
是否有GTK3或GTK3 ++的等价物?
我试图使用mmap函数分配一些具有只读访问权限的内存页面。我打印/proc/self/maps以检查内存保护是否正常工作。即使的保护论据mmap是PROT_READ
7fec0c585000-7fec0c785000 r-xp 00000000 00:00 0
Run Code Online (Sandbox Code Playgroud)
这意味着当我要求内核分配一些只读内存页面时,也会将它们也标记为可执行。
我做了一些其他的测试,我意识到当我要求一个只写页面,PROT_WRITE 而没有时PROT_READ,maps文件的输出是这样的:
7fec0c585000-7fec0c785000 -w-p 00000000 00:00 0
Run Code Online (Sandbox Code Playgroud)
这意味着除了前面的示例外,PROT_READ等效于PROT_EXEC
同时调用mmap,也PROT_WRITE|PROT_READ可以执行。
我想知道是否有一种方法可以映射只读的无可执行内存的页面;还是一个读写但没有可执行文件的文件?
运行测试的计算机的信息:
Linux Arch 4.1.6-1-ARCH#1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015 x86_64 GNU / Linux
英特尔酷睿i5-2310,x86_64