繁体   English   中英

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

[英]the “new” operator in c++, pointer question

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

SomeClass *person = new SomeClass();

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

如果new成功完成,它总是返回一个指针(如果它没有成功完成,则抛出异常,并且不返回任何内容)。

指针指向已创建的对象,如果是数组,指针指向数组的第一个元素。

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

new在堆上创建一个对象,它可以返回的是它的地址 - 一个指针。

是。 如果你问为什么它没有返回引用,因为引用比指针更好,答案是历史遗产。

当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!

新表达式返回一个指针,但您可以将它与“智能指针”类(例如来自Boost )一起使用。 所以:

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

我还应该指出,虽然如果你来自Java背景,在C ++中你可能习惯使用括号,但在使用默认构造函数时不需要使用括号。 因此,例如,在默认构造时,通常会写入new T ,但是在使用非默认构造函数构造对象时,会写入new T(param)new T(param1,...,paramN)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM