2012-03-28 40 views
-1

我认为VC++编译器为每个类提供'delete'操作符的定义,如果它不是程序员提供的。任何人都可以确认吗?如果未定义,VC++为每个类提供默认的“删除”操作符

在VC++中生成的dis汇编代码说,每个类都有一个通用的'new'运算符。但是,每个类都存在“删除”操作符。这里是证据:

delete bPtr; 
// The dis assembly code generated by vc++ for above line  
.... 
**call  Base::`scalar deleting destructor' (411253h)** 
.... 

delete [] bPtrArr; 

// The dis assembly code generated by vc++ for above line 
.... 
**call  Base::`vector deleting destructor' (41125Dh)** 
.... 

调用堆栈:

malloc.exe!Base::~Base() Line 128 
malloc.exe!Base::`scalar deleting destructor'() + 0x2b bytes 
malloc.exe!wmain(int argc=0x00000001, wchar_t * * argv=0x00343250) Line 173 + 0x2b bytes 
malloc.exe!__tmainCRTStartup() Line 579 + 0x19 bytes 
malloc.exe!wmainCRTStartup() Line 399 
+0

是的,这是正确的。 – 2012-03-28 13:37:00

+0

@Dew你应该小心摆出问题。我相信你的意思是新的和删除小写。但是,它总是要更具体,并且在语义上与句子用法一致,在语法上是正确的。 – Invictus 2012-03-28 13:53:02

+0

编辑中的代码不是每个类的“删除”的证据。它只是表明对于数组,标量的'delete'和'delete []'是有区别的。这是合理的和预期的。 – Blastfurnace 2012-03-28 15:42:17

回答

4

不可以,但newdelete(小写)的标准定义,并通过编译器来提供。没有定义自己版本的类使用默认实现。

+0

生成的分解代码让我觉得编译器为每个类提供'delete'操作符。 – 2012-03-28 14:26:24

1

operator newoperator delete都是非成员函数或静态成员函数。*唯一默认定义的是全局名称空间。默认情况下没有定义类成员。

你所看到的是删除析构函数。这只存在于具有虚拟析构函数的类中。除了销毁最多派生的对象外,这样的析构函数也可以释放内存,就像直接在最大派生对象上使用delete运算符一样。这不能没有虚拟调度,所以delete从析构函数中调用 - 因此名称。

这是一种特定的析构函数,根本不是operator delete。它只是调用operator delete,它已经住在别的地方。

编辑: MSVC显然也是这样做,当最派生类型是静态的已知。这是一种有效的方法,但删除析构函数的依据仍然基于虚拟析构函数。在这种情况下,总是通过delete表达式调用删除析构函数,并且由其他任何东西(return语句,派生类析构函数等)调用非删除析构函数。

*(虽然,容易混淆,当他们的成员,即使它没有写下来的static关键字总是暗示的保证。)

+0

我的'基础'类没有虚拟析构函数/方法。 – 2012-03-28 14:23:58

+0

@DewKumar:呵呵。那么,微软可以这样做,标准确实允许。没有太大区别。 – Potatoswatter 2012-03-28 14:27:35

+0

'delete'操作符的常用方法也可以提供,因为提供了通用'new'方法:)。我想知道为什么VC++不提供通用的'删除'方法。 – 2012-03-28 14:32:02

1

由于一些人有“是”:没有

这很重要,因为它有非常明显的实际后果。

自动生成的唯一运算符是复制赋值运算符T& operator=(T const&)。由于该运算符正在生成,基类分配运算符默认为隐藏。如果需要这样的运营商在派生类中可用,则需要使用如果运营商不是自动生成则不需要的情况。

现在,你写“新”,但没有这样的语言。有new关键字,其在new表达式使用的,并且存在(一组的重载)operator new,其相反为分配函数。例如,编写new T()为类T的一个实例动态分配内存,并在该内存区域中构造一个T实例,而T::operator new只是由T定义的分配函数的调用。它定义了一个。

默认情况下,new表达式使用全局分配函数,即全局operator new。但是一个班级可以定义自己的自定义operator new。然后调用它,如果它是可访问的,以便编译new表达式。

相关问题