the “new” operator in c++, pointer question

后端 未结 5 1356
说谎
说谎 2021-02-19 17:53

Dumb question, but whenever you call new, do you always have a pointer?

SomeClass *person = new SomeClass();

And is that because you need a poi

相关标签:
5条回答
  • 2021-02-19 18:26

    new creates an object on the heap and all it can return is its address - a pointer.

    0 讨论(0)
  • 2021-02-19 18:33

    Yes. If you are asking why it doesn't return a reference instead, since references are nicer than pointers, the answer is historical heritage.

    When C++ was in development, if the machine was unable to get memory for the object, a special pointer NULL was returned. This is how it is done in C:

    SomeClass *person;
    person = (SomeClass*) malloc( sizeof( SomeClass ) );
    if ( person == NULL ) fprintf( stderr, "no more people allowed!" );
    

    In standard C++, errors are returned by exception instead:

    try {
        SomeClass *person = new SomeClass;
        // do something
    } catch ( std::bad_alloc ) {
        std::cerr << "no more people!" << std::endl;
    } catch ( ... ) {
        // using exceptions allows for other errors
        // from inside SomeClass::SomeClass too
    }
    

    You can still do it the old-fashioned way, though, with nothrow:

    SomeClass *person = new( std::nothrow ) SomeClass;
    if ( person == NULL ) std::cerr << "no more people allowed!" << std::endl;
    

    The upshot is, this is perfectly reasonable and good style:

    SomeClass &person = * new SomeClass; // don't need no stinkin pointers!
    
    0 讨论(0)
  • 2021-02-19 18:36

    Yes, always a pointer. Even if you want to overload new, return type must be void*.
    And you are right about purpose

    0 讨论(0)
  • 2021-02-19 18:43

    The new expression returns a pointer, but you can use it with "smart pointer" classes (e.g. from Boost). So:

    boost::shared_ptr<SomePerson> person(new SomePerson);
    

    I should also point out that, though you may be used to using the parentheses if you come from a Java background, in C++, the parentheses are not needed when using the default constructor. So, for example, one ordinarily writes new T when default constructing, but one writes new T(param), or new T(param1,...,paramN) when constructing an object using a constructor other than the default.

    Yes, that is correct; one could, theoretically, write (new SomePerson)->doSomething(), but that would be a memory leak; C++ does not have garbage collection, so it is necessary to store the result of the new expression in something (a pointer or a smart pointer) so that it can be properly deallocated.

    0 讨论(0)
  • 2021-02-19 18:45

    If new completes successfully, it always returns a pointer (if it doesn't complete successfully, an exception is thrown, and nothing is returned).

    The pointer is to the object that was created, or in the case of an array, a pointer to the first element of the array.

    0 讨论(0)
提交回复
热议问题