zoukankan      html  css  js  c++  java
  • new 和 delete 运算符

    C++ 支持使用操作符 newdelete 来动态分配和释放对象。

    new 运算符调用特殊函数 operator newdelete 运算符调用特殊函数 operator delete

    如果 new 分配内存失败,异常 std::bad_alloc会被抛出。

    可以如下测试内存分配失败的情况:

    #include <iostream>
    using namespace std;
    #define BIG_NUMBER 100000000
    int main() {
       int *pI = new int[BIG_NUMBER];
       if( pI == 0x0 ) {
          cout << "Insufficient memory" << endl;
          return -1;
       }
    }
    

    使用 new 操作符动态分配的内存可以通过 delete 操作符进行释放。
    delete 操作符会触发调用类的析构函数(如果有的话)。

    以下示例为用户自定义的 operator newoperator delete

    #include <iostream>
    using namespace std;
    
    int fLogMemory = 0;      // Perform logging (0=no; nonzero=yes)?
    int cBlocksAllocated = 0;  // Count of blocks allocated.
    
    // User-defined operator new.
    void *operator new( size_t stAllocateBlock ) {
       static int fInOpNew = 0;   // Guard flag.
    
       if ( fLogMemory && !fInOpNew ) {
          fInOpNew = 1;
          clog << "Memory block " << ++cBlocksAllocated
              << " allocated for " << stAllocateBlock
              << " bytes
    ";
          fInOpNew = 0;
       }
       return malloc( stAllocateBlock );
    }
    
    // User-defined operator delete.
    void operator delete( void *pvMem ) {
       static int fInOpDelete = 0;   // Guard flag.
       if ( fLogMemory && !fInOpDelete ) {
          fInOpDelete = 1;
          clog << "Memory block " << cBlocksAllocated--
              << " deallocated
    ";
          fInOpDelete = 0;
       }
    
       free( pvMem );
    }
    
    int main( int argc, char *argv[] ) {
       fLogMemory = 1;   // Turn logging on
       if( argc > 1 )
          for( int i = 0; i < atoi( argv[1] ); ++i ) {
             char *pMem = new char[10];
             delete[] pMem;
          }
       fLogMemory = 0;  // Turn logging off.
       return cBlocksAllocated;
    }
    

    上述代码可以用来检测内存泄漏,重新定义全局操作符 newdelete 来计算内存的分配和释放次数。

    编译器支持在类中声明成员数组 newdelete 操作符:

    class X  {
    public:
       void * operator new[] (size_t) {
          return 0;
       }
       void operator delete[] (void*) {}
    };
    
    void f() {
       X *pX = new X[5];
       delete [] pX;
    }
    
  • 相关阅读:
    MyEclipse 修改代码不生效
    最简单的网页分享代码
    php libevent 扩展使用示例
    function gzdecode
    20165327 2017-2018-2 《Java程序设计》第9周学习总结
    结对编程_四则运算
    20165327 2017-2018-2 《Java程序设计》第8周学习总结
    2017-2018-2 20165327 实验二 《Java面向对象程序设计》实验报告
    20165327 2017-2018-2 《Java程序设计》第7周学习总结
    20165327 2017-2018-2 《Java程序设计》第6周学习总结
  • 原文地址:https://www.cnblogs.com/Steven-HU/p/14395584.html
Copyright © 2011-2022 走看看