做之间有什么区别:
MyClass * ptr = new MyClass;
和
MyClass * ptr = &MyClass;
和
MyClass * ptr = NULL;
等等。
然后执行ptr->func1();
有什么区别?我应该使用哪些?我该如何使用它们?
答案 0 :(得分:4)
尽量不要使用第一个,使用:
MyClass a;
只要你可以(如果你真的需要动态分配,请使用std::unique_ptr
)。
第二个不会编译。
第三个将定义一个指针并用空指针初始化它。考虑nullptr
而不是NULL
对于可选对象,也可以是boost::optional
或std::optional
(它可以在那里,但不需要)。
答案 1 :(得分:1)
假设MyClass
被定义为:
class MyClass
{
public:
void func1();
};
然后在你的3条建议中,只有第一条完全有效。
new MyClass
尝试创建MyClass实例,如果成功则返回指向实例的指针,并指定给ptr
。调用ptr->func1()
会像您期望的那样使用该实例上的成员函数。
第二个:
MyClass * ptr = &MyClass;
不是有效的C ++,不会编译。
第三种选择:
MyClass * ptr = NULL;
有效但在此之后调用ptr->func1()
是调用未定义的行为。这将编译正常,但会显示为运行时问题。
NULL
只是值0
。如果由于某种原因你直接使用指针而不是你应该确保一个没有指向一个对象的指针总是被设置为这个值。 C ++ 11有nullptr
更难以意外地使用错误,所以除非你需要支持旧的C ++标准,否则它将是首选。
然后,您可以使用简单的if
语句检查指针是否有效:
if(ptr)
{
ptr->func1();
}
现代惯用语C ++虽然很少涉及这种指针操作。 使用自动变量,例如:
MyClass myObject;
myObject.func1();
通常是可取的,因为它通常比使用动态分配更有效和更安全。
如果您确实需要动态分配,那么通常首选使用智能指针来处理棘手的细节。 如果您使用的是C ++ 11,则可以访问rich set of smart pointers。如果没有,那么您仍然可以使用smart pointers from boost。