指针问题是c ++中的“new”运算符

时间:2010-04-28 01:54:35

标签: c++ pointers

愚蠢的问题,但每当你打电话给新人时,你总是有指针吗?

SomeClass *person = new SomeClass();

那是因为你需要一个指向指向为SomeClass变量人分配的新内存空间的指针吗?谢谢!

5 个答案:

答案 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 ++没有垃圾收集,因此有必要将新表达式的结果存储在某个东西(指针或智能指针)中,以便可以正确地解除分配。