拥有对象实例与拥有指针
Posted
技术标签:
【中文标题】拥有对象实例与拥有指针【英文标题】:Owning instance of object vs owning pointer 【发布时间】:2013-08-10 14:30:03 【问题描述】:假设我有两个 A 类和 B 类。B 类可以通过两种方式使用 A。
第一:
class B
A *a;
第二:
class B
A a;
与Second
相比,为什么大多数C++ 库更喜欢使用First
版本。使用第二种方法可能有什么缺点。它与堆栈与堆分配有关吗?请澄清。
【问题讨论】:
我不知道为什么你认为第一个版本更好,我通常使用第二个。第一个,类的分配和删除要小心, 这取决于你如何定义use
?
“为什么大多数 C++ 库更喜欢使用第一个版本而不是第二个版本” 那么您查看了超过 50% 的现有 C++ 库?开玩笑,他们是不同的。例如。 Why not use pointers for everything? 和许多其他答案。
这取决于如何使用 A。例如,如果您在 B 上有一个用于 A 的 getter 函数,它返回一个指向它的指针:A* a = b->getA();
,然后 b 被删除,那么在第二个示例中,您将有一个悬空指针 *a
您还可以存储对 A 类实例的引用。
【参考方案1】:
拥有实例的一些优势 (class B A a; ;
):
a
的创建和销毁,因为它会自动发生。
无需担心a
可能是悬空指针或空指针。
内存位置:a
位于 B
实例所在的位置。如果您有大量 B
s 数组并依次访问每个 B
的 A
,这可能会产生显着的速度差异。
内存效率:不需要存储指针。
为了进行全面概括,可以说这种方法更快且更安全。
拥有指针的一些优点 (class B A *a; ;)
:
a
实际上可以指向A
的子类。
无需复制A
的实例即可重新分配a
。
a
可以独立于 B
生活,甚至完全由另一个对象拥有。
a
可以为空,如果不总是需要释放内存。
为了进行另一个大范围的概括,可以说这种方法更灵活。
【讨论】:
多态也可以使用引用来实现。 “指针”类别的所有优点以及“非指针”类别的一些优点都可以使用智能指针来实现。以上是关于拥有对象实例与拥有指针的主要内容,如果未能解决你的问题,请参考以下文章