the “new” operator in c++, pointer question
愚蠢的问题,但是每当您调用new时,总有一个指针吗?
1 | SomeClass *person = new SomeClass(); |
就是因为您需要一个指针来指向分配给SomeClass变量人员的新内存空间? 谢谢!
如果
指针指向创建的对象,对于数组,则指向数组的第一个元素。
是的,始终是一个指针。即使您想重载new,返回类型也必须为void *。
而且你对目的是正确的
new在堆上创建一个对象,它只能返回其地址-指针。
是。如果您问为什么它不返回引用,因为引用比指针好,所以答案是历史遗产。
在开发C ++时,如果机器无法为该对象获取内存,则会返回一个特殊的指针
1 2 3 | SomeClass *person; person = (SomeClass*) malloc( sizeof( SomeClass ) ); if ( person == NULL ) fprintf( stderr,"no more people allowed!" ); |
在标准C ++中,错误由异常返回,而不是:
1 2 3 4 5 6 7 8 9 | 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 } |
不过,您仍然可以使用
1 2 | SomeClass *person = new( std::nothrow ) SomeClass; if ( person == NULL ) std::cerr <<"no more people allowed!" << std::endl; |
结果是,这是完全合理和良好的风格:
1 | SomeClass &person = * new SomeClass; // don't need no stinkin pointers! |
新表达式返回一个指针,但是您可以将其与"智能指针"类一起使用(例如,来自Boost的类)。所以:
1 | boost::shared_ptr<SomePerson> person(new SomePerson); |
我还应该指出,尽管如果您来自Java背景,虽然您可能习惯使用括号,但是在C ++中,使用默认构造函数时不需要括号。因此,例如,通常在默认构造时写入
对,那是正确的;从理论上讲,可以编写(new SomePerson)-> doSomething(),但这将导致内存泄漏; C ++没有垃圾回收,因此有必要将新表达式的结果存储在某种东西(指针或智能指针)中,以便可以正确地重新分配它。