C++ 结构最佳方法中的向量?C++;

C++ 结构最佳方法中的向量?C++;,c++,vector,struct,C++,Vector,Struct,我试图在我的结构中包含一个向量 这是我的结构: struct Region { bool hasPoly; long size1; long size2; long size3; long size4; long size5; long size6; //Mesh* meshRef; // the mesh with the polygons for this region long meshRef; std::

我试图在我的结构中包含一个向量

这是我的结构:

struct Region 
{
    bool hasPoly;
    long size1; 
    long size2;
    long size3;
    long size4;
    long size5;
    long size6;
    //Mesh* meshRef; // the mesh with the polygons for this region
    long meshRef;
    std::vector<int> PVS;
} typedef Region;
struct区域
{
布尔哈斯波利;
长尺寸1;
长尺寸2;
长尺寸3;
长尺寸4;
长尺寸5;
长尺寸6;
//Mesh*meshRef;//包含此区域多边形的网格
长网状结构;
std::载体PVS;
}typedef区域;
此声明中的向量是否有效,或者使用指向向量的指针更有意义。对于指向向量的指针,是否需要分配新向量。我将如何做到这一点

谢谢

编辑:问题是它最终导致指向xmemory.h的错误,xmemory.h是MSVC++平台附带的一个文件

    void construct(pointer _Ptr, _Ty&& _Val)
        {   // construct object at _Ptr with value _Val
        ::new ((void _FARQ *)_Ptr) _Ty(_STD forward<_Ty>(_Val)); // this is the line
         }
void构造(指针Ptr,Ty&&Val)
{//在_Ptr处用值_Val构造对象
::新建((void _FARQ*)_Ptr)_Ty(_stdforward(_Val));//这是行
}

有趣的是,如果我将它分配到结构之外,而只是分配到我使用的函数中,则不会发生这种情况。有什么想法吗?

这样做完全有道理,而且在任何方面都不需要
新的
,除非您真的想为一个单独的向量别名。此外,这里不需要任何
typedef
内容。

这取决于您如何使用它

如果要在复制
区域
结构时复制向量和数据,请将其保留为非指针

如果你不想把它复制过来,那么你需要某种指向向量的指针

如果使用指向向量的指针,则应该非常小心分配/解除分配异常的安全性。如果您不能以异常安全的方式确定分配的范围,那么您将留下内存泄漏的可能性

以下是几个选项:

  • 确保分配向量(并使用
    区域
    )的代码也解除分配向量,并且本身是异常安全的。这将要求
    区域
    仅存在于该代码的范围内。
    只需在堆栈上分配向量,并将其传递给
    区域中的指针即可。然后确保不要在堆栈帧上方返回
    区域
    对象
  • 您还可以在
    区域中使用某种智能指针->向量

向量很好。请注意,如果复制此结构,则向量将与其一起复制。因此,在具有特定性能约束的代码中,对待此结构的方式与对待任何其他昂贵的复制类型的方式相同

在生产代码中,有些人希望您使用
class
关键字而不是
struct
关键字来定义此类,因为
vector
成员使其成为非POD。如果你是自己风格指南的作者,那就没什么好担心的


但是,
typedef
是错误的,只需编写
struct Region{stuff}

您可以这样编写,而无需使用typedef:

struct Region 
{
    bool hasPoly;
    long size1; 
    long size2;
    long size3;
    long size4;
    long size5;
    long size6;
    long meshRef;
    std::vector<int> PVS;
}; // no typedef required
struct区域
{
布尔哈斯波利;
长尺寸1;
长尺寸2;
长尺寸3;
长尺寸4;
长尺寸5;
长尺寸6;
长网状结构;
std::载体PVS;
}; // 不需要typedef
回答您的问题:

此声明中的向量有效吗

是的

或者做一个指向向量的指针会更有意义吗

不,可能不会。如果您这样做了,那么您必须为复制行为实现复制构造函数、赋值运算符和析构函数。你会得到同样的结果,但这将是额外的工作,并可能引入错误

对于指向向量的指针,是否需要分配新向量。我将如何做到这一点

您需要实现复制构造函数、复制赋值运算符和析构函数:

//复制构造函数
区域(常数区域和rhs):
哈斯波利(右哈斯波利),
// ... 复制其他成员,就像上面的hasPoly一样,但下面的PV除外:
PVS(新标准::矢量(*rhs.PVS))
{
}
//复制赋值运算符
区域和运算符=(常量区域和rhs)
{
如果(此!=&rhs)
{
hasPoly=rhs.hasPoly;
//…复制所有字段,如上面的hasPoly,但下面的PV除外:
删除PV;
PVS=新标准::向量(*rhs.PVS);
}
归还*这个;
}
//析构函数
地区::~Region()
{
删除PV;
}
一句话:你的代码很好。你不需要改变它


编辑:修复分配运算符:检查与此的比较并返回*此。

这是完全有效的。如果您想使用指针,则必须在构造函数中分配向量。因为您使用C++,所以我不需要在那里使用TyPulf。@ SATCHMO:我在MSVC++Express 10中没有得到这个错误,代码完全按照您定义的那样…这是运行时错误:访问违规写入位置。非常奇怪,因为它只在向量位于结构中时发生。如果我在实际函数中声明了一个向量,它会很好地工作。@Beta:如果他正确地编译了它,那么构造函数中的分配在语义上与非指针成员相同(除了堆分配部分)。他仍然需要实现“三大”,适当的RAII模式,等等。请参阅编辑以了解正在发生的问题。很抱歉此站点新增:)+1。三巨头通常也要求实施复制和交换:
// Copy constructor
Region(const Region & rhs) :
    hasPoly(rhs.hasPoly),
    // ... copy other members just like hasPoly above, except for PVS below:
    PVS(new std::vector<int>(*rhs.PVS))
{
}

// Copy assignment operator
Region & operator=(const Region & rhs)
{
    if (this != &rhs)
    {
         hasPoly = rhs.hasPoly;
         // ... copy all fields like hasPoly above, except for PVS below:

         delete PVS;
        PVS = new std::vector<int>(*rhs.PVS);
    }
    return *this;
}

// Destructor
Region::~Region()
{
    delete PVS;
}