C ++中的“ new”运算符,指针问题

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

愚蠢的问题,但是每当您调用new时,总有一个指针吗?

1
SomeClass *person = new SomeClass();

就是因为您需要一个指针来指向分配给SomeClass变量人员的新内存空间? 谢谢!


如果new成功完成,它将始终返回一个指针(如果未成功完成,将引发异常,并且不返回任何内容)。

指针指向创建的对象,对于数组,则指向数组的第一个元素。


是的,始终是一个指针。即使您想重载new,返回类型也必须为void *。
而且你对目的是正确的


new在堆上创建一个对象,它只能返回其地址-指针。


是。如果您问为什么它不返回引用,因为引用比指针好,所以答案是历史遗产。

在开发C ++时,如果机器无法为该对象获取内存,则会返回一个特殊的指针NULL。这是在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
}

不过,您仍然可以使用nothrow以老式的方式进行操作:

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 T,但是在使用默认构造以外的构造函数构造对象时,通常写入new T(param)new T(param1,...,paramN)

对,那是正确的;从理论上讲,可以编写(new SomePerson)-> doSomething(),但这将导致内存泄漏; C ++没有垃圾回收,因此有必要将新表达式的结果存储在某种东西(指针或智能指针)中,以便可以正确地重新分配它。