C ++是否对类成员进行了深度初始化?

时间:2009-02-05 06:38:56

标签: c++ data-structures oop

我在C ++中有一个带有以下成员的类:

map< someEnum, vector<SomeObject*>* > someMap

所以我有一张地图,它为我提供了每个枚举对象的向量。对于我的生活,我无法理解C ++是如何初始化这些对象的。它是否默认初始化它们?如果没有,我需要做什么?

无论我如何尝试这样做,我都会遇到分段错误(我已经尝试了所有),所以我猜我在概念上缺少某些东西。

<小时/> 我应该注意到我尝试使用:

map< someEnum, vector<SomeObject*> > someMap

同样也不行。在这种情况下,C ++是否会对向量进行深度初始化?

4 个答案:

答案 0 :(得分:7)

规则是:如果STL容器包含指向对象的指针,它会在堆上创建对象并将它们分配给这些指针。但是,如果它本身包含对象,则调用每个包含对象的默认构造函数,从而对其进行初始化。

这里有一个包含指针的地图(无论哪种类型)。所以不要指望地图使这些指针指向内存。

答案 1 :(得分:3)

看起来地图会为您提供指向对象矢量的指针。如果您尝试通过

使用地图

mymap[MY_ENUM]->push_back(whatever);

在初始化之前,你会得到一个段错误。您需要先初始化矢量

mymap[MY_ENUM] = new vector<SomeObject*>;

或者,很多更好,只需让地图给你一个简单的'矢量

map <someEnum, vector<SomeObject*> > mymap;

当您第一次调用mymap[MY_ENUM]时,向量将被默认初始化(大小为零)。问题是你在放大之前试图使用向量的条目,例如,

mymap[MY_ENUM][2] = whatever;

您仍然需要使用push_backresize,或者给您一些空间的东西。

答案 2 :(得分:2)

通过声明一个对象,你不会得到SomeObject指针的向量很好地隐藏在该映射中。

相反,你必须这样做:

map< someEnum, vector< SomeObject* >* > someMap;

someMap [ somevalue ] = new vector< SomeObject* >;

someMap [ somevalue ] -> push_back( new SomeObject );

你的痛苦不会在这里结束。在地图超出范围之前,您需要正确清理它。

// Untested code, may not even compile.
for( map< someEnum, vector< SomeObject* >* >::iterator iter = someMap.begin( ) ; iter != someMap.end( ) ; ++i )
{
     for( vector< SomeObject* >::iterator v = iter -> second -> begin( ) ; v != iter -> second -> end( ) ; ++v )
         delete *v;

     delete iter -> second;
}

答案 3 :(得分:1)

你会得到一个可以存储std :: vector *的空地图,由someEnum引用。空地图将包含NO矢量。由你来创建一个新的矢量对象(new是最安全的方法)并将其指针存储在地图中。

这可能是挑剔,但如果枚举是一个固定的(小)尺寸,那么为什么地图为他们?除非你的人口稀少,否则一个简单的数组将更容易让你的面条得到更多的空间和CPU效率。

C ++无法初始化地图或向量的内容,因为它不知道想要存储在哪里。