为什么不在C++中全部使用指针?

76

假设我定义了一个类:

class Pixel {
    public:
      Pixel(){ x=0; y=0;};
      int x;
      int y;
}

然后编写一些使用它的代码。为什么我要这样做?

Pixel p;
p.x = 2;
p.y = 5;

作为一个Java开发者,我经常这样写:

Pixel* p = new Pixel();
p->x = 2;
p->y = 5;

它们基本上做同样的事情,对吧? 一个在堆栈上,另一个在堆上,所以我需要稍后将其删除。它们之间有任何基本区别吗?为什么我应该更喜欢其中一个而不是另一个?

23个回答

0

在堆栈上创建的对象比分配的对象更快。

为什么?

因为使用默认内存管理器分配内存需要一些时间(查找一些空块或甚至分配该块)。

此外,当超出范围时,堆栈对象会自动销毁,因此您不必担心内存管理问题。

如果您的设计允许使用堆栈对象,则不使用指针时代码更简单。我建议您这样做。

我个人不会使用智能指针来复杂化问题。

另一方面,我在嵌入式领域工作过一段时间,使用堆栈创建对象并不明智(因为为每个任务/线程分配的堆栈不是很大-您必须小心)。

因此,这是选择和限制的问题,没有适合所有情况的答案。

而且,始终不要忘记尽可能地保持简单


0

基本上,当您使用原始指针时,您没有RAII。


-2

除非向Pixel类添加更多成员,否则第一种情况是最好的选择。 随着越来越多的成员被添加,可能会出现堆栈溢出异常。


我的意思是成员指的是成员变量,而不是方法。如果我表达不清楚,很抱歉。 - Uday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接