迭代 std::vector 时的分段错误
Segmentation Fault when iterating std::vector
我有一个连续多次调用的方法,用于对包含 std::vectors 对象的 std::vector 对象执行迭代打印。
class Message
{
public:
struct Child
{
Child:a(0.0F),b(0.0F)
{}
float a;
float b;
};
struct Parent
{
Parent:x(0U),y(0U)
{}
unsigned char x;
unsigned char y;
std::vector<Child> childList;
};
Message();
~Message();
printingMethod();
addParent();
private:
unsigned int s;
unsigned int t;
std::vector<Message::Parent> parentList;
}
Message::addParent(Message::Parent newParent)
{
parentList.push_back(newParent);
}
Message::printingMethod()
{
std::cout << s << std::endl;
std::cout << t << std::endl;
for(unsigned int i = 0U; i < parentList.size(); i++)
{
const Parent myParent = parentList[i];
std::cout << myParent.x << std::endl;
std::cout << myParent.y << std::endl;
for(unsigned int j = 0U; j < myParent.childList.size(); j++)
{
const Child mychild = myParent.childList[j];
std::cout << mychild.a << std::endl;
std::cout << mychild.b << std::endl;
}
}
}
Main()
{
Message myMessage;
//some code to initialise myMessage's vector by calling addParent
//....
//...
int idx = 0;
while (idx < 10000000)
{
myMessage.printingMethod();
idx++;
}
}
如果 while 循环只循环 100 次,就不会有问题。但是,如果我将 while 循环增加到 10000000 次,则本节将有可能出现分段错误:
for(unsigned int i = 0U; i < parentList.size(); i++)
{
const Parent myParent = parentList[i];//<-segmentation fault
std::cout << myParent.x << std::endl;
std::cout << myParent.y << std::endl;
for(unsigned int j = 0U; j < myParent.childList.size(); j++)
{
const Child mychild = myParent.childList[j];//<-segmentation fault
std::cout << mychild.a << std::endl;
std::cout << mychild.b << std::endl;
}
}
但是,如果我简单地将其更改为参考对象,则没有分割错误。
for(unsigned int i = 0U; i < parentList.size(); i++)
{
const Parent & myParent = parentList[i];//<-no segmentation fault
std::cout << myParent.x << std::endl;
std::cout << myParent.y << std::endl;
for(unsigned int j = 0U; j < myParent.childList.size(); j++)
{
const Child & mychild = myParent.childList[j];//<- no segmentation fault
std::cout << mychild.a << std::endl;
std::cout << mychild.b << std::endl;
}
}
谁能解释为什么我对复制的对象有分割错误,而不是对引用的对象?
还是"修复"只是侥幸,我最终会遇到分段错误?
蒂亚。
为了帮助您找到它为什么会出现错误,正如注释中指出的那样,您希望在代码中散布一些 cout,以查看向量的大小和您使用的索引 (j(。
同样使用myParent.childList.at(j)
会在你出界时准确地投掷。
在您的情况下,引用的使用只是打开了一些优化,这可以解释为什么它不会出错,但您不应该依赖它。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?