我试图在我的结构中包含一个向量。
这是我的结构:
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;
此声明中的向量是有效还是更有意义地指向向量。在指向矢量的指针的情况下,我是否需要分配新的矢量。我该如何做到这一点?
谢谢!
编辑:问题是它最终导致错误指向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
}
有趣的是,如果我将它分配到结构之外并且只是在我使用的函数中,它就不会发生。有什么想法吗?
答案 0 :(得分:5)
你可以不用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
回答你的问题:
此声明中的向量是否有效
是的,是的。
或者做一个指向矢量的指针会更有意义。
不,可能不是。如果您这样做,则必须为复制行为实现复制构造函数,赋值运算符和析构函数。你最终会得到同样的结果,但这将是额外的工作并可能引入错误。
在指向矢量的指针的情况下,我是否需要分配新的矢量。我该如何做到这一点?
您需要实现复制构造函数,复制赋值运算符和析构函数:
// 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;
}
底线:你的代码很好。你不需要改变它。
编辑:修复赋值运算符:检查与此对比并返回* this。
答案 1 :(得分:3)
这样做是完全合理的,并且在任何方面你都不需要new
,除非你真的想要别名一个单独的向量。此外,您不需要在此处进行任何typedef
内容。
答案 2 :(得分:2)
这取决于你如何使用它。
如果要在复制Region
结构时复制矢量和数据,请将其保留为非指针。
如果你不想复制它,那么你需要某种指向矢量的指针。
如果使用指向向量的指针,则应该非常小心分配/释放异常安全性。如果您无法以异常安全的方式确定分配范围,那么您将留下内存泄漏的可能性。
有几种选择:
Region
)也会释放向量,并且本身是异常安全的。这将要求Region
仅存在于该代码的范围内
您可以通过简单地在堆栈上分配向量,并将其传递给Region
中的指针来完成此操作。然后确保永远不会在该堆栈框架上方返回Region
对象。Region
。答案 3 :(得分:1)
矢量很好。请注意,如果复制此结构,则将使用它复制向量。因此,在具有特定性能约束的代码中,以与处理任何其他昂贵的复制类型相同的方式处理此结构。
在生产代码中,有些人希望您使用class
关键字而不是struct
关键字来定义此类,因为vector
成员使其成为非POD。如果您是自己风格指南的作者,则无需担心。
typedef
错误,只需写struct Region { stuff };