MyClass c(10);
MyClass c = MyClass(10);
据我所知,这两个对象初始化可以互换使用,对吗? 此外,当它们超出范围时,它们会自动清理,例如从函数返回。
MyClass* c = new MyClass(10);
此对象需要手动清理,例如“删除c”。
MyClass* getObj() {
MyClass c(10); // stack initiated object
return &c;
}
这将返回指向我的堆栈范围的MyClass对象的指针(因为我没有使用new关键字)。 事实上,我不应该使用返回给它的指针,因为在使用时对象可能已被清理或稍后失败。正确吗?
MyClass getObj() {
MyClass c(10); // stack initiated object
return c;
}
在这种情况下,堆栈启动对象的副本将返回对调用者范围有效,对吗?
提前谢谢。
亲切的问候, 赫尔曼
答案 0 :(得分:2)
1°)是的,但是如果您想要安全,则不应使用MyClass a(10);
语法,因为您可能会遇到most vexing parse个问题。理想情况下,您可以使用以下语法(假设c ++ 11)表示初始化而没有任何歧义:
MyClass a{10};
2°)是的。但是你应该依赖RAII并尽可能地使用智能指针并且想要分配资源。
3°)这很糟糕,因为返回的指针指向离开函数时自动释放的内存(当本地对象c
被破坏时)。
4°)是的,但更好的是,使用named value return optimization,你甚至不应该得到一个副本,因为编译器通常很聪明,看不到破坏本地对象并返回副本没有意义