小编fel*_*ght的帖子

为什么虚拟析构函数需要删除运算符

在使用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

c++ delete-operator virtual-destructor

13
推荐指数
1
解决办法
1473
查看次数

为什么在AMD64中删除了BCD指令?

二进制编码的十进制指令至少来自i8086是x86架构的一部分.它们类似于AAA,DAA,AAS,DAS,并且有助于处理BCD数字的算术运算.

以下是它们的一些参考:

https://en.wikipedia.org/wiki/Intel_BCD_opcode

根据英特尔软件开发人员手册.这些指令在长(64位)模式下不可用.我知道也许唯一真正知道为什么是建筑设计师的人,但为什么你认为他们删除它们?

assembly x86-64

8
推荐指数
1
解决办法
729
查看次数

如何禁用GTK3中的按钮

Windows API有一个名为EnableWindow禁用控件的函数,因此用户无法再与它们进行交互.

是否有GTK3或GTK3 ++的等价物?

c gtk gtkmm gtk3

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

为什么在mmap中PROT_READ等于PROT_EXEC

我试图使用mmap函数分配一些具有只读访问权限的内存页面。我打印/proc/self/maps以检查内存保护是否正常工作。即使的保护论据mmapPROT_READ

 7fec0c585000-7fec0c785000 r-xp 00000000 00:00 0
Run Code Online (Sandbox Code Playgroud)

这意味着当我要求内核分配一些只读内存页面时,也会将它们也标记为可执行。

我做了一些其他的测试,我意识到当我要求一个只写页面,PROT_WRITE 而没有时PROT_READmaps文件的输出是这样的:

7fec0c585000-7fec0c785000 -w-p 00000000 00:00 0 
Run Code Online (Sandbox Code Playgroud)

这意味着除了前面的示例外,PROT_READ等效于PROT_EXEC

同时调用mmap,也PROT_WRITE|PROT_READ可以执行。

我想知道是否有一种方法可以映射只读的无可执行内存的页面;还是一个读写但没有可执行文件的文件?


运行测试的计算机的信息:

  1. Linux Arch 4.1.6-1-ARCH#1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015 x86_64 GNU / Linux

  2. 英特尔酷睿i5-2310,x86_64

linux mmap memory-mapping

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