愚蠢的问题,但每当你打电话给新人时,你总是有指针吗?
SomeClass *person = new SomeClass();
那是因为你需要一个指向指向为SomeClass变量人分配的新内存空间的指针吗?谢谢!
答案 0 :(得分:15)
如果new
成功完成,它总是返回一个指针(如果它没有成功完成,则抛出异常,并且不返回任何内容)。
指针指向已创建的对象,如果是数组,指针指向数组的第一个元素。
答案 1 :(得分:3)
是的,总是一个指针。即使您想要超载新,返回类型也必须 void * 。
而你的目的是正确的
答案 2 :(得分:2)
new在堆上创建一个对象,它可以返回的是它的地址 - 一个指针。
答案 3 :(得分:1)
是。如果你问为什么它没有返回引用,因为引用比指针更好,答案是历史遗产。
当C ++处于开发阶段时,如果机器无法为对象获取内存,则返回特殊指针NULL
。这是在C中完成的方式:
SomeClass *person;
person = (SomeClass*) malloc( sizeof( SomeClass ) );
if ( person == NULL ) fprintf( stderr, "no more people allowed!" );
在标准C ++中,异常返回错误:
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
:
SomeClass *person = new( std::nothrow ) SomeClass;
if ( person == NULL ) std::cerr << "no more people allowed!" << std::endl;
结果是,这是完全合理和良好的风格:
SomeClass &person = * new SomeClass; // don't need no stinkin pointers!
答案 4 :(得分:0)
新表达式返回一个指针,但您可以将它与“智能指针”类(例如from Boost)一起使用。所以:
boost::shared_ptr<SomePerson> person(new SomePerson);
我还应该指出,虽然如果你来自Java背景,你可能习惯使用括号,但在C ++中,使用默认构造函数时不需要使用括号。因此,例如,在默认构造时,通常会写new T
,但在使用非默认构造函数构造对象时,会写new T(param)
或new T(param1,...,paramN)
。
是的,这是正确的;从理论上讲,可以写(new SomePerson) - &gt; doSomething(),但那会是内存泄漏; C ++没有垃圾收集,因此有必要将新表达式的结果存储在某个东西(指针或智能指针)中,以便可以正确地解除分配。