C++ Gotchas 条款63:Member New和Member Delete之生存期与活动空间的迷惑

原创 2003年04月21日 08:57:00

Gotcha #63: Confusing Scope and Activation of Member new and delete<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Gotcha条款63Member NewMember Delete之生存期与活动空间的迷惑

 

当一个类别的对象被创建和销毁时,其所声明的member operator newmember operator delete会被唤起。施行分配的表达式所处的实际生存空间(scope)与此无关:

 

class String {

public:

  void *operator new( size_t ); // member operator new

  void operator delete( void * ); // member operator delete

  void *operator new[]( size_t ); // member operator new[]

  void operator delete [] ( void * ); // member operator delete[]

  String( const char * = "" );

  // . . .

};

void f() {

  String *sp = new String( "Heap" ); // 使用 String::operator new

  int *ip = new int( 12 ); // 使用 ::operator new

  delete ip; // 使用 :: operator delete

  delete sp; // 使用 String::delete

}

 

分配操作所处的生存空间无关大局,只有被分配对象的型别才真正决定哪一个分配函数被调用:

 

String::String( const char *s )

: s_( strcpy( new char[strlen(s)+1], s ) )

{}

 

字符数组在class Stringscope内被分配内存,但分配使用的是global array new,而非String的那个array new——因为型别不同,char并不是String。经由显式的限定(explicit qualification),我们可以这样做:

 

String::String( const char *s )

: s_( strcpy( reinterpret_cast<char *>

(String::operator new[](strlen(s)+1 )),s ) )

{}

 

如果我们能够使用形如String::new char[strlen(s)+1]的语句来调用Stringoperator new[]就好了,但这是非法的,行不通。(尽管我们可以使用::new的形式来调用global operator newglobal operator new[],使用::delete的形式来调用global operator deleteglobal operator delte[]。)

C++ Gotchas 条款63:Member New和Member Delete之生存期与活动空间的迷惑

Gotcha #63: Confusing Scope and Activation of Member new and deleteGotcha条款63:Member New和Member De...
  • hejishan
  • hejishan
  • 2008年04月01日 16:35
  • 151

MFC— 无法添加按钮函数“cannot add new member” 和_CrtIsValidHeapPointer

 MFC—— 无法添加按钮函数“cannot add new member” 今天给MFC对话框中添加了一个按钮,想给他添加函数,可是双击他的时候显示“cannot add new member”,由...
  • wjj1987
  • wjj1987
  • 2011年06月08日 16:24
  • 5809

编程技巧之:双击VC对话框提示cannot add new member以及类向导中没有已经建立的类的解决方法

VC问题解决:双击VC对话框提示cannot add new member以及类向导中没有已经建立的类的解决方法...
  • a408789699
  • a408789699
  • 2010年06月03日 00:23
  • 4799

MFC/出现cannot add new member

在编辑一个工程的时候,添加一个按钮,对这个按钮产生消息函数 双击按钮之后出现 cannot add new member 网上说删除.clw文件 我发现并没有这个后缀的文件 以下是我...
  • qq718090840
  • qq718090840
  • 2016年05月20日 20:56
  • 379

浅出理解静态成员函数(static member function)

  在转入正题之前,我觉得应该先提出两个我本人自定义的术语:类级成员(class level member)和对象级成员(object level member)。我不知道在C++领域里是否已经有这样...
  • danky
  • danky
  • 2006年12月17日 20:25
  • 12124

【C++】 深入探究 new 和 delete

在C++中,我们应该经常会用到new、delete,它们是C++的一个关键字,同时也是一个操作符,下面我将我对这两者的了解和学习做一个总结和探讨。new和delete的全过程首先我们定义一个对象A: ...
  • codedoctor
  • codedoctor
  • 2017年07月27日 14:29
  • 627

C++:关于class member声明为static的情况

2014.5.27 reference: C++ primer 5th, $7.6:Static Class Members TOPIC 1:一个类中的member(data member和funct...
  • tong_xin2010
  • tong_xin2010
  • 2014年05月27日 15:52
  • 868

07 C# 第六章 继承

一,继承 为了最大限度的实现代码的复用,我们可以把一些有相同特征的类的属性和行为抽象出来放到一个更上层的类中,作为基类。 让这些特殊的类通过某种方式拥有这个基类中的属性和行为。这种方式便是继承。 ...
  • wangzhiyu1980
  • wangzhiyu1980
  • 2013年02月14日 19:07
  • 4342

关于c++常量函数(const member function)

在c++ primer中对于常最函数的解析如下: By default, the type of this is a const pointer to nonconst version of the ...
  • u010842603
  • u010842603
  • 2016年10月29日 20:30
  • 562

forbids in-class initialization of non-const static member不能在类内初始化非const static成员

今天写程序,出现一个新错误,好吧,感觉每次编程都能遇到新问题,我期待久病成医的那一天,哈哈。 事故代码如下: class Employee { public: Employee() {myid ...
  • King_DJF
  • King_DJF
  • 2016年12月12日 14:46
  • 1057
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Gotchas 条款63:Member New和Member Delete之生存期与活动空间的迷惑
举报原因:
原因补充:

(最多只允许输入30个字)