Microsoft KB Archive/156808

From BetaArchive Wiki

Article ID: 156808

Article Last Modified on 7/13/2005



APPLIES TO

  • The Standard C++ Library, when used with:
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++ 6.0 Standard Edition



This article was previously published under Q156808

SUMMARY

The sample code below illustrates how to use the new operator from the Standard Library in Visual C++.

MORE INFORMATION

The new operator will return NULL or throw an exception on failure.

Required header

   <new>
                

Prototype

   void *operator new(size_t n)
   void *operator new(size_t n, const nothrow&)
   void *operator new[](size_t n);
                

Note The class/parameter names in the prototype may not match the version in the header file. Some have been modified to improve readability.

Description

The first operator new will attempt to allocate memory and if it fails will throw an exception.

The second operator new accepts a second parameter of type nothrow. This parameter indicates that if the allocation fails, it should return NULL and not throw an exception.

The third operator new will allocate memory for an array of that type and if it fails will throw an exception.

Sample code

////////////////////////////////////////////////////////////////////// 
// 
// Compile options needed: /GX
// 
// <filename> :  newop.cpp
// 
// Functions:
// 
//    void *operator new(size_t n)
// 
//    void *operator new(size_t n, const nothrow&)
// 
//    void *operator new[](size_t n);
// 
// Written by Linda Koontz
// of Microsoft Product Support Services,
// Copyright (c) 1996 Microsoft Corporation. All rights reserved.
////////////////////////////////////////////////////////////////////// 

/* Compile options needed: /GX
*/ 

#include <new>
#include <iostream>

#if _MSC_VER > 1020   // if VC++ version is > 4.2
   using namespace std;  // std c++ libs implemented in std
   #endif

class BigClass {
public:
    BigClass() {};
    ~BigClass(){}
        double BigArray[99999999];
};

void main()
{
    try {
    BigClass * p = new BigClass;
    }
    catch( bad_alloc a) {
        const char * temp = a.what();
        cout << temp << endl;
        cout << "Threw a bad_alloc exception" << endl;
    }
    BigClass * q = new(nothrow) BigClass;
    if ( q == NULL )
        cout << "Returned a NULL pointer" << endl;

    try {
    BigClass * r = new BigClass[3];
    }
    catch( bad_alloc a) {
        const char * temp = a.what();
        cout << temp << endl;
        cout << "Threw a bad_alloc exception" << endl;
    }
}
                

REFERENCES

For more information about new operator, visit the following Microsoft Developer Network (MSDN) Web site:

Note The Online Help for the new header file lists the following prototypes for the new operators demonstrated in this article:

    void *operator new(size_t n) throw(bad_alloc);

    void *operator new(size_t n, const nothrow&) throw();

    void *operator new[](size_t n) throw(bad_alloc);
                

The throw() following the prototype is an exception specification that is not implemented in Visual C++ version 4.2. This is noted in the Online Help:

   Microsoft C++ does not support the function exception
   specification mechanism, as described in section 15.4 of the
   ANSI C++ draft.
                

An exception-specification specifies the type of exceptions a function can throw. For example,

   void Func() throw (ProblemOne, ProblemTwo) {}
                

is equivalent to:

    void Func() {
    {
    try {}
    catch (ProblemOne) {}
    catch (ProblemTwo) {}
    catch (...) { unexpected(); }
    }
                


Additional query words: STL STLSample new

Keywords: kbhowto kbinfo kbcode KB156808