C++ ";新";c+中的运算符+;,指针问题

C++ ";新";c+中的运算符+;,指针问题,c++,pointers,C++,Pointers,这是个愚蠢的问题,但无论何时你调用new,你总是有一个指针吗 SomeClass *person = new SomeClass(); 这是因为您需要一个指针来指向分配给SomeClass变量person的新内存空间吗?谢谢 如果new成功完成,它总是返回一个指针(如果它没有成功完成,则抛出异常,并且不返回任何内容) 指针指向已创建的对象,如果是数组,则指向数组的第一个元素。新表达式返回指针,但您可以将其用于“智能指针”类(例如)。因此: boost::共享的个人(新的某人); 我也应该指出,

这是个愚蠢的问题,但无论何时你调用new,你总是有一个指针吗

SomeClass *person = new SomeClass();

这是因为您需要一个指针来指向分配给SomeClass变量person的新内存空间吗?谢谢

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


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

新表达式返回指针,但您可以将其用于“智能指针”类(例如)。因此:

boost::共享的个人(新的某人);

我也应该指出,尽管你可能习惯于使用括号,如果你来自java背景,C++中,在使用默认构造函数时不需要括号。因此,例如,在默认构造时,通常写入

new T
,但在使用默认构造函数以外的构造函数构造对象时,通常写入
new T(param)
,或
new T(param1,…,paramN)


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

< P>是的,总是指针。即使要重载新建,返回类型也必须是无效*

你的目标是对的

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

在开发C++时,如果机器无法获取对象的内存,则返回一个特殊指针<代码> null < /C>。在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
}

结果是,这是非常合理和好的风格:

SomeClass &person = * new SomeClass; // don't need no stinkin pointers!

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

注意
new T
new T()
在没有任何用户声明构造函数的情况下对POD类型和类类型有不同的结果:
new T()
将值初始化对象,而
new T
不会。@James,是的,我知道这一点;然而,SomePerson最有可能是一个类。在
new
表达式中空参数是否重要是C++的一个小噩梦:SomeClass&person=*newsomeclass;-我认为这不是一个好的样式,因为您使用它作为自动变量,并且还必须记住在范围结束时删除它。直接向MEM泄漏,IMO.和一个大的惊喜,谁将保持您的代码,认为大多数会考虑最后一个例子坏的风格。虽然您可以在某个点返回指针,但不太清楚对象是动态分配的,必须删除。您还必须担心有一天,在多重继承的情况下,有人用基类替换引用类型——那么您可能根本无法获得分配的指针@Alexander,@Nick:如果对象未超出本地范围,则使用
new
是糟糕的设计,任何样式都无法弥补这一点。@Nick:基本引用与基本指针在可使用的强制转换方面没有什么不同-除了动态强制转换抛出而不是返回
NULL
,这是一件好事。你提出的局部范围问题正是我不推荐这个的原因。如果要将此对象传递到程序的其他部分,则必须明确谁必须删除它。大多数拥有对象所有权并在不再需要对象时将其删除的函数都使用指针。这打破了传统,使事情变得不那么清楚。另请参见。可以执行
MyClass*p=new(std::nothrow)MyClass
。在这里,以防失败,而不是投掷。
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!