This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Is the C++ Exception object created on the heap?

I write the code like the following,

        // Note that the output object below functions like the C++'s cout. It's my own
        // implementation of displaying program information and it's insignificant here.
        try{
                try{
                        //output<<"exhausting the heap"<<endl;
                        int* p = new int();
                                while(p!=NULL){
                                p = new int();
                                }
                        //output<<" heap exhausted"<<endl;
                }
                catch(...){
                        // never reaches here because I use the --force_new_nothrow
                        // Even if I dont't use --force_new_nothrow, the program never
                        // reaches here too...
                        //output<<"heap exhausted. and received an exception"<<endl;
                }

                //output<<"now I throw an int"<<endl;
                throw int(); 

        }
        catch(...){
                // unfortunately, the program never reach here
                // I guess it's because the exception object is to be created on the heep
                // but the heap is already exhausted.
                // So how should I handle the exception when allocation fails occurs?

                // output some debug imformation
                //output<<"unkown exception"<<endl;
        }
        // never reaches here too...
        //output<<"end"<<endl;
        while(1);


Actually the originan code I wrote is more complated. The Exception obj I throw is a class, so is the allocation object type I use to exhaust the heap. I output the address of these object, under the conditions of exhausted heap and unexhausted respectively. I found there is an exception object created on the heap.

So could anyone tell me how to handle the exception when memory allocation fails occurs ?

Parents Reply Children
  • any trailing punctuation on a URL confuses this forum software!

    But it's not just this forum software; lots of forums which attempt to automatically detect URLs make this type of mistake - the safe rule is to always ensure that there is clear whitespace around a URL.

  • Thanks to scott,
    I include these code, the behavior becomes desirable.

    // To initialize the exceptions system before main is entered,
    // we have to include the following function in the link.
    // __ARM_exceptions_init will be called before main and
    // init of any global variables
    extern "C" void __cxa_get_globals(void);
    extern "C" void __ARM_exceptions_init(void)
    {
            output<<"__ARM_exceptions_init()"<<endl;
        __cxa_get_globals();
    }
    
    // this function is never called. To make __ARM_exceptions_buffer_init called,
    // we must include the symbol __ARM_exceptions_buffer_required
    extern "C" void __ARM_exceptions_buffer_required(){
            output<<"__ARM_exceptions_buffer_required()"<<endl;
            return ;
    }
    
    //static int buf[20];
    
    // simple re-definition, not necessary. I worte it just to trace the call of
    // functions
    // extern "C" void *__ARM_exceptions_buffer_init(){
    //      output<<"__ARM_exceptions_buffer_init()"<<endl;
    //      return buf; // just to test the behavior
    // }
    // extern "C" void *__ARM_exceptions_buffer_allocate(void *buffer, size_t size){
    //      output<<"__ARM_exceptions_buffer_allocate()"<<endl;
    //       // just to test the behavior when heap is exhausted
    //       // no complicated management is required here!
    //      return buf;
    // }
    // extern "C" void *__ARM_exceptions_buffer_free(void *buffer, void *addr){
    //      output<<"__ARM_exceptions_buffer_free()"<<endl;
    //      return addr;
    // }
    
    // test code
    int main(void) {
            output<<" in main function "<<endl;
        try{
            try{
                output<<"exhausting the heap"<<endl;
                int* p = new int();
                    while(p!=NULL){
                    p = new int();
                    }
                output<<" heap exhausted"<<endl;
            }
            catch(...){ /* never reach here because I use the --force_new_nothrow */
                            output<<"heap exhausted. and received an exception"<<endl;
            }
    
            output<<"now I throw an int"<<endl;
            throw int();
        }
            catch(char){
                    output<<"catch a char"<<endl;
            }
            catch(int ){
                    output<<"catch an int"<<endl;
            }
        catch(...){
            // output some debug imformation
            output<<"unkown exception"<<endl;
        }
        output<<"end"<<endl;
        while(1);
    }
    
    

    Here is the output :
    __ARM_exceptions_init() in main function
    exhausting the heap heap exhausted
    now I throw an int
    catch an int
    end

    if I un-comment the three functions and the global buf in the code, the output then becomes:
    __ARM_exceptions_init()
    __ARM_exceptions_buffer_init() in main function
    exhausting the heap heap exhausted
    now I throw an int
    __ARM_exceptions_buffer_allocate()
    catch an int
    __ARM_exceptions_buffer_free()
    end