是否应该动态/静态地分配初始化并存储在另一个类中的对象?

时间:2011-08-29 01:37:28

标签: c++ memory-management

我是C ++的新手但我在C中有一些基本的内存分配知识。我正在编写一个类卡,它存储卡号和类Activity对象的列表。

class Card {
    public:
    Card();
    ~Card();
    vector<Activity> activities;
    int cardNo;
}

目前,我使用以下代码初始化Activity对象:

Activity a = Activity("a"); 

并将它们推送到Card对象中定义的向量。

但我发现人们倾向于使用Activity * a = new Activity(“a”)来初始化(动态分配?),并且当函数声明它们时,将释放以前一种方式声明的对象(静态分配?)终止。

然后,如果我以与之前相同的方式初始化Activity对象,但是使用“new Card()”方式初始化Card,是否可能在释放Card对象之前取消分配Activity对象?我应该切换到使用“new Activity()”来初始化存储在Card中的对象吗?

3 个答案:

答案 0 :(得分:1)

不,你做的很好。将对象推送到vector时,会复制一份副本。因此,当您的函数返回时,您的a会被销毁,但您添加它的vector仍然有自己的单独副本。

有人可能动态分配类的实例并将其推送到向量上的一个原因是复制该特定类的对象是昂贵的(并且vector在内部进行大量复制)并且他们想要为了避免这种情况,所以它们存储指针而不是对象,以便只制作指针的副本,而不是对象的副本(这不会那么昂贵)。这一切都取决于班级;通常,您可以使用对象向量而不会出现任何性能问题。

注意:Activity a = Activity("a");的快捷方式 1 Activity a("a"),或者更好,根据Benjamin的建议行事activites.push_back(Activity("a"))如果您没有执行某些操作在你推动它之前Activity

1 这不是一个真正的捷径,因为它做了不同的事情,但是出于你的意图和目的,它就是。

答案 1 :(得分:0)

  

“但我发现人们倾向于使用Activity * a = new初始化   活动(“a”)代替(动态分配?)“

什么人?他们做错了。你做得对,有点儿。你可以这样做:

activities.push_back(Activity("a"));

答案 2 :(得分:0)

您需要指针的一些情况:

  • 它可能是NULL而不是某些虚拟状态
  • 是多态的
  • 分享,而不是专属于
  • 存在循环依赖或递归,阻止直接成员变量

在这种特殊情况下,与大多数STL容器一样,成员变量优先于成员指针。