将结构数据类型推入向量
Pushing a struct datatype into a vector
我的结构是
类型
struct SegData
{
Ogre::Vector3 startPt;
Ogre::Vector3 endPt;
float r,g,b;
float velBeg , velEnd;
};
SegData seg;
我有一个向量
std::vector< SegData> temp;
我正在尝试将 SegData 类型的数据推回到我的向量温度中。
seg.startPt = Ogre::Vector3(0,0,0);
seg.endPt = Ogre::Vector3(1,1,1);
seg.r = 1;
seg.g = 1;
seg.b = 1;
temp.push_back(SegData());
temp.push_back(seg);
我无法将向量 temp 中的元素段推回,结果是 "Segmentation fault (core dumped)"。
有人可以帮我解决这个问题吗?我不明白发生了什么。
编辑
我重新启动了笔记本电脑,段错误消失了。但是我得到奇怪的数组大小。我在下面发布代码:
SegData seg;
std::vector< SegData> temp;
zeroVec = Ogre::Vector3(0,0,0);
posStart = Ogre::Vector3(msg->segments[j].S.position.x,msg->segments[j].S.position.y,
msg->segments[j].S.position.z);
posEnd = Ogre::Vector3(msg->segments[j].line.E.position.x,msg->segments[j].line.E.position.y,
msg->segments[j].line.E.position.z);
//This is a pointer of class rviz::Line that helps plot line
lineVisual->setPoints(posStart,posEnd);
posLeft = posStart;
//Loop for pushing in the segData into Vector
if(posStart!= zeroVec && posEnd!= zeroVec)
{
float dist = posStart.distance(posEnd);
if (dist<1) dist = 1.0;
if (segVec.size() == 0 || flag<id)
{
ROS_INFO_STREAM("INSERTING NEW ELEMENT FOR ID"<<id); //id is passed on to this function
segVec.push_back(std::vector<SegData> ());
flag = id;
}
for(float i = 1.0; i<= int(dist); i++)
{
posRight.x = posStart.x+ (posEnd.x - posStart.x)*(i/dist);
posRight.y = posStart.y+ (posEnd.y - posStart.y)*(i/dist);
posRight.z = 0;
posLeft = posRight;
seg.startPt = posLeft;
seg.endPt = posRight;
seg.r = 1;
seg.g = 1;
seg.b = 1;
temp.push_back(SegData());
ROS_INFO_STREAM( "pushing inside temp of size "<<temp.size());
temp.push_back(seg);
ROS_INFO_STREAM( "SIZE OF SEGVEC AT ID: "<<id<<" IS: "<<segVec[id].size());
}
segVec.push_back(temp);
输出:
PROCESS MESSAGE
[ INFO] [1470169803.527734377]: INSERTING NEW ELEMENT FOR ID0
[ INFO] [1470169803.528113954]: pushing inside temp of size 1
[ INFO] [1470169803.528180252]: SIZE OF SEGVEC AT ID: 0 IS: 0
[ INFO] [1470169803.528206653]: pushing inside temp of size 3
[ INFO] [1470169803.528227194]: SIZE OF SEGVEC AT ID: 0 IS: 0
[ INFO] [1470169803.528250226]: pushing inside temp of size 5
[ INFO] [1470169803.528270518]: SIZE OF SEGVEC AT ID: 0 IS: 0
//For the next ID
PROCESS MESSAGE
[ INFO] [1470169810.320975693]: INSERTING NEW ELEMENT FOR ID1
[ INFO] [1470169810.321037171]: pushing inside temp of size 1
[ INFO] [1470169810.321063642]: SIZE OF SEGVEC AT ID: 1 IS: 5030930206624027720
[ INFO] [1470169810.321093659]: pushing inside temp of size 3
[ INFO] [1470169810.321117828]: SIZE OF SEGVEC AT ID: 1 IS: 5030930206624027720
[ INFO] [1470169810.321141908]: pushing inside temp of size 5
为什么我的矢量大小迅速膨胀?
大尺寸值太奇怪了,一定是一些垃圾值,而不是真正的尺寸。
我的第一个猜测可能是 您正在使用的库 (OGRE) 的数据类型正在执行它自己的自定义内存管理,例如类型 Ogre::Vector3
可能需要一些特定的内存对齐条件(出于性能考虑或矢量化目的等)。 std::vector<SegData>
使用 STL 的默认分配器,可能无法很好地满足所需的对齐条件。
出于好奇,我稍微搜索了一下,找到了this post。所以基本上你可以尝试将 STLAllocator<GeneralAllocPolicy>
作为第二个模板参数( 指定自定义分配器的类型 )传递给 std::vector。这可能值得一试,只需将向量声明为:
std::vector<SegData, STLAllocator<SegData,GeneralAllocPolicy> > temp;
(在原来的 post 中,我认为他们忘记了第二个 SegData
模板参数)。如果它不起作用,您可能需要检查库文档页面 (f.e。this one) 以查看是否应该有其他分配器或者是其他问题。
另请注意,这是一个相当普遍的问题:许多库选择使用自己的内存管理策略,要么是出于性能优化,要么仅仅是由于对齐约束。例如,Eigen(一个 C++ 线性代数库)库的固定大小向量必须与它的 aligned_allocator
一起用于正确对齐(如果您需要,请参阅 here对更多细节感兴趣)。
希望对您有所帮助!
我的结构是
类型 struct SegData
{
Ogre::Vector3 startPt;
Ogre::Vector3 endPt;
float r,g,b;
float velBeg , velEnd;
};
SegData seg;
我有一个向量
std::vector< SegData> temp;
我正在尝试将 SegData 类型的数据推回到我的向量温度中。
seg.startPt = Ogre::Vector3(0,0,0);
seg.endPt = Ogre::Vector3(1,1,1);
seg.r = 1;
seg.g = 1;
seg.b = 1;
temp.push_back(SegData());
temp.push_back(seg);
我无法将向量 temp 中的元素段推回,结果是 "Segmentation fault (core dumped)"。
有人可以帮我解决这个问题吗?我不明白发生了什么。
编辑
我重新启动了笔记本电脑,段错误消失了。但是我得到奇怪的数组大小。我在下面发布代码:
SegData seg;
std::vector< SegData> temp;
zeroVec = Ogre::Vector3(0,0,0);
posStart = Ogre::Vector3(msg->segments[j].S.position.x,msg->segments[j].S.position.y,
msg->segments[j].S.position.z);
posEnd = Ogre::Vector3(msg->segments[j].line.E.position.x,msg->segments[j].line.E.position.y,
msg->segments[j].line.E.position.z);
//This is a pointer of class rviz::Line that helps plot line
lineVisual->setPoints(posStart,posEnd);
posLeft = posStart;
//Loop for pushing in the segData into Vector
if(posStart!= zeroVec && posEnd!= zeroVec)
{
float dist = posStart.distance(posEnd);
if (dist<1) dist = 1.0;
if (segVec.size() == 0 || flag<id)
{
ROS_INFO_STREAM("INSERTING NEW ELEMENT FOR ID"<<id); //id is passed on to this function
segVec.push_back(std::vector<SegData> ());
flag = id;
}
for(float i = 1.0; i<= int(dist); i++)
{
posRight.x = posStart.x+ (posEnd.x - posStart.x)*(i/dist);
posRight.y = posStart.y+ (posEnd.y - posStart.y)*(i/dist);
posRight.z = 0;
posLeft = posRight;
seg.startPt = posLeft;
seg.endPt = posRight;
seg.r = 1;
seg.g = 1;
seg.b = 1;
temp.push_back(SegData());
ROS_INFO_STREAM( "pushing inside temp of size "<<temp.size());
temp.push_back(seg);
ROS_INFO_STREAM( "SIZE OF SEGVEC AT ID: "<<id<<" IS: "<<segVec[id].size());
}
segVec.push_back(temp);
输出:
PROCESS MESSAGE
[ INFO] [1470169803.527734377]: INSERTING NEW ELEMENT FOR ID0
[ INFO] [1470169803.528113954]: pushing inside temp of size 1
[ INFO] [1470169803.528180252]: SIZE OF SEGVEC AT ID: 0 IS: 0
[ INFO] [1470169803.528206653]: pushing inside temp of size 3
[ INFO] [1470169803.528227194]: SIZE OF SEGVEC AT ID: 0 IS: 0
[ INFO] [1470169803.528250226]: pushing inside temp of size 5
[ INFO] [1470169803.528270518]: SIZE OF SEGVEC AT ID: 0 IS: 0
//For the next ID
PROCESS MESSAGE
[ INFO] [1470169810.320975693]: INSERTING NEW ELEMENT FOR ID1
[ INFO] [1470169810.321037171]: pushing inside temp of size 1
[ INFO] [1470169810.321063642]: SIZE OF SEGVEC AT ID: 1 IS: 5030930206624027720
[ INFO] [1470169810.321093659]: pushing inside temp of size 3
[ INFO] [1470169810.321117828]: SIZE OF SEGVEC AT ID: 1 IS: 5030930206624027720
[ INFO] [1470169810.321141908]: pushing inside temp of size 5
为什么我的矢量大小迅速膨胀?
大尺寸值太奇怪了,一定是一些垃圾值,而不是真正的尺寸。
我的第一个猜测可能是 您正在使用的库 (OGRE) 的数据类型正在执行它自己的自定义内存管理,例如类型 Ogre::Vector3
可能需要一些特定的内存对齐条件(出于性能考虑或矢量化目的等)。 std::vector<SegData>
使用 STL 的默认分配器,可能无法很好地满足所需的对齐条件。
出于好奇,我稍微搜索了一下,找到了this post。所以基本上你可以尝试将 STLAllocator<GeneralAllocPolicy>
作为第二个模板参数( 指定自定义分配器的类型 )传递给 std::vector。这可能值得一试,只需将向量声明为:
std::vector<SegData, STLAllocator<SegData,GeneralAllocPolicy> > temp;
(在原来的 post 中,我认为他们忘记了第二个 SegData
模板参数)。如果它不起作用,您可能需要检查库文档页面 (f.e。this one) 以查看是否应该有其他分配器或者是其他问题。
另请注意,这是一个相当普遍的问题:许多库选择使用自己的内存管理策略,要么是出于性能优化,要么仅仅是由于对齐约束。例如,Eigen(一个 C++ 线性代数库)库的固定大小向量必须与它的 aligned_allocator
一起用于正确对齐(如果您需要,请参阅 here对更多细节感兴趣)。
希望对您有所帮助!