C ++一些堆栈和堆的理解

用户名

请回答一些问题并声明以确认或修改。我想确保我做对了,感谢您的任何提示。此外,我可以想象这些示例对于C ++初学者总体而言具有一定的价值。

  1. 堆栈启动的对象

MyClass c(10);
MyClass c = MyClass(10);

据我了解,这两个对象初始化可以互换使用,对吗?此外,它们超出范围时会自动清除,例如从函数返回。

  1. 堆启动对象

MyClass* c = new MyClass(10);

该对象需要手动清除,例如“删除c”。

  1. 对象错误功能

MyClass* getObj() {
        MyClass c(10); // stack initiated object
        return &c;
}

这将返回一个指向我的堆栈作用域MyClass对象的指针(因为我没有使用new关键字)。事实上,我不应该使用返回给它的指针,因为在使用该对象时,该对象可能已经被清理或稍后失败。正确的 ?

  1. 有效的对象复制功能

MyClass getObj() {
        MyClass c(10); // stack initiated object
        return c;
}

在这种情况下,将返回堆栈启动对象的副本,该副本对调用者的范围有效,对吗?

先感谢您。

亲切的问候,赫尔曼

JBL

1°)是,尽管为了安全起见,也不应使用该语法,MyClass a(10);因为您可能会遇到大多数令人烦恼的解析问题。理想情况下,您可以使用以下语法(假定为c ++ 11)来表达初始化而没有任何歧义:

MyClass a{10};

2°)是。但是您应该依靠RAII并在可能的情况下使用智能指针,并希望分配资源。

3°)这很不好,因为返回的指针指向离开函数时(本地对象c已被销毁)时自动释放的内存

4°)是的,但是更好的是,使用命名值返回优化,您甚至不应该最终得到副本,因为编译器通常足够聪明,以至于看不到销毁本地对象并返回副本的意义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章