【问题标题】:Array of classes. Stack or heap?类数组。堆栈还是堆?
【发布时间】:2010-02-19 12:12:26
【问题描述】:
class temp;

temp *t;

void foo() { temp foo2; t[1] = foo2; }

int main() { 
    t = new temp[100];
    foo();
    //t[1] is still in memory?
}
  • 如果我想要一个这样的类数组,我将不得不使用 指向指针的指针?(并使用'new' 在数组中的每个元素上)例如: temp **t;
  • 如果我想做一个 100 ptr 到 ptr 的数组我必须做 temp **t = new temp[100][1]; 是 没有更好的方法可以做到这一点 4 个方括号?

【问题讨论】:

  • 分配对象数量的经验法则是:本地存储中的少量,动态内存中的大量。外部内存中的大量数据(磁盘驱动器、内存映射、特定于操作系统)。如果您不想为管理对象删除而头疼,请使用 智能指针(搜索 Boost Smart_Ptr)。

标签: c++ arrays pointers


【解决方案1】:

代码:

t = new temp[100];

构造一个包含 100 个 temp 类型对象的数组。做同样事情的更安全的方法是:

std::vector <temp> t(100);

这使您不必在数组上调用 delete[]。

【讨论】:

    【解决方案2】:

    在你完全清楚自己在做什么之前,尽量避免接触新事物。

    std::vector<temp> t(100);
    

    将以完美的方式完成工作。您仍然可以在您的解决方案中使用 [] 运算符和类似的方法访问它。

    temp foo2; t[1] = foo2;
    

    将调用临时类的赋值运算符。 使用 & 将变量传递给函数。

    void foo1(std::vector<temp>& lt)
    {
    }
    
    void foo2(temp& lt)
    {
    }
    
    foo1(t);
    foo2(t[1]);
    

    【讨论】:

    • “将调用临时类的复制构造函数”实际上,您的代码使用赋值运算符,而不是复制构造函数。
    【解决方案3】:

    首先,我支持其他人的建议,避免使用 new 并改用 std::vector。 std::vector 省去了很多指针和数组带来的麻烦。数组在很大程度上是 C 解决方案,而不是 C++ 解决方案。

    回答你的问题:这里不需要指针到指针的类型。原因是数组自然是通过指针来寻址的。

    当你说t = new temp[100]; 时,会发生两件事:

    • 从空闲存储区(或“堆”)分配一个新数组
    • t 设置为指向新数组的第一个元素。

    当您使用p[i] 运算符时,它实际上是*(p + i) 的语法糖。例如:

    • t[0] 等价于 *(t + 0),也就是 *t,或者 t 指向的元素:数组的第一个元素。
    • t[1] 等价于 *(t + 1)。由于t 是指向数组第一个元素的指针,t + 1 是指向第一个元素之后的元素的指针:第二个元素。所以*(t + 1) 给了你第二个元素。

    使用此系统,temp * 指针可用于引用整个 temp 数组,而不仅仅是单个 temp 实例。

    如果你真的想了解数组和指针,你可以比阅读comp.lang.c FAQ 的第 6 章做得更糟。但是请注意,这是 C 资源,而不是 C++ 资源;这是因为在 C++ 中,通常不使用数组,因为您有一个更好的功能可用:std::vector。我强烈建议您将学习 std::vector 放在比学习指针和数组更高的优先级。

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2021-06-19
      • 2010-11-06
      • 2015-05-03
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多