把一个 Class/Struct 实例化成普通对象,和通过 new 实例成一个指针有什么不同吗?

2014-02-19 08:33:37 +08:00
 ivanlw
比如:
struct Node
{
int val;
Node(int v) : val(v) {}
};
int main()
{
Node *a = new Node(3); //这样子
Node b(5); //和这样子
return 0;
}

目前知道的就是new是在heap上分配的,效率可能低一些;还有b的那种方式不能用->的指针符访问对象的元素,有什么其他实质性的不同吗?
1214 次点击
所在节点    C
6 条回复
Wins0n
2014-02-19 08:51:14 +08:00
要记得delete
timothyqiu
2014-02-19 09:07:24 +08:00
Node *a = new Node(3) 的意思是:

1. 在堆上创建一个 Node 对象
2. 在栈上创建一个名为 a 的指针指向它

Node b(3) 的意思是:

1. 在栈上创建一个 Node 对象,名为 b


p.s. a->val 是 (*a).val 的语法糖而已...
ivanlw
2014-02-19 09:36:01 +08:00
所以,实际中用起来应该如何选择呢?
wog
2014-02-19 09:40:48 +08:00
再补充楼上的一下

虽然a 和b 出了main的作用域都会失效,但是a指向的实体,只要不delete,会一直存在。b不用delete
baka
2014-02-19 10:16:42 +08:00
一般不在栈上实例化,并且对象传参时都会使用指针形式(或c++引用),避免复制栈存储。
另外,指针形式支持多态,可以根据虚表选择继承链上的类。
ivanlw
2014-03-11 18:48:46 +08:00
@baka 多谢……可是,如果在栈上实例化,那么传参的时候也可以用引用的吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/100853

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX