Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能';Don’不要缩小分段错误的原因 我正在使用一个程序来创建和显示一个使用C++中的SFML的PythGracas树。我创建的类继承自SFML类Drawable,该类具有纯虚拟函数“draw”,我相信segFault来自于我对该函数的定义 #include <cmath> #include <SFML/Graphics.hpp> #include <vector> class PTree: public sf::Drawable{ public: PTree(float length); PTree(sf::RectangleShape shape); ~PTree(){}; void pTree(int depth); virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; private: sf::RectangleShape square; PTree* leftPoint; PTree* rightPoint; bool hasNext; }; PTree::PTree(float length){ sf::Vector2f size(length,length); sf::RectangleShape shape(size); square = shape; square.setFillColor(sf::Color::Red); square.setPosition(5.5*length,6.5*length); hasNext = true; } PTree::PTree(sf::RectangleShape shape){ square = shape; square.setFillColor(sf::Color::Red); hasNext = true; } void PTree::pTree(int depth){ if(depth == 0){ this->leftPoint = NULL; this->rightPoint = NULL; this->hasNext = false; return; } sf::Vector2f oldSize = this->square.getSize(); float oldL = oldSize.x; float newL = sqrt(pow(oldL,2)/2); sf::Vector2f newSize(newL,newL); sf::Vector2f point1 = this->square.getPoint(0); sf::Vector2f point2 = this->square.getPoint(1); sf::RectangleShape left(newSize); sf::RectangleShape right(newSize); left.setOrigin(0,0-newL); right.setOrigin(newL,0-newL); left.setPosition(point1); right.setPosition(point2); left.rotate(45); right.rotate(-45); PTree Left(left); PTree Right(right); leftPoint = &Left; rightPoint = &Right; Left.pTree(depth-1); Right.pTree(depth-1); } void PTree::draw(sf::RenderTarget& target, sf::RenderStates states) const{ target.draw(this->square); if(!hasNext){ return; } PTree& leftTree = *leftPoint; PTree& rightTree = *rightPoint; leftTree.draw(target,states); //this is where the error occurs rightTree.draw(target,states); } int main(int argc, char* argv[]){ float length = atof(argv[1]); int depth = atoi(argv[2]); PTree tree(length); tree.pTree(depth); float windowH = 8 * length; float windowW = 12 * length; sf::RenderWindow window(sf::VideoMode(windowW,windowH), "Pythagoras Tree"); while(window.isOpen()){ sf::Event event; while(window.pollEvent(event)){ if(event.type == sf::Event::Closed) window.close(); } window.clear(); tree.draw(window,sf::RenderStates::Default); window.display(); } } #包括 #包括 #包括 类树:公共sf::可绘制{ 公众: PTree(浮动长度); PTree(sf::矩形形状); ~PTree(){}; 空隙树(内部深度); 虚拟虚空绘制(sf::RenderTarget&target,sf::RenderStates状态)常量; 私人: sf::矩形正方形; p树*左点; PTree*rightPoint; 布尔·哈斯奈特; }; PTree::PTree(浮动长度){ sf::矢量2F大小(长度、长度); sf::矩形形状(尺寸); 正方形=形状; 正方形。setFillColor(sf::Color::红色); 方形。设置位置(5.5*长度,6.5*长度); hasNext=true; } PTree::PTree(sf::矩形形状){ 正方形=形状; 正方形。setFillColor(sf::Color::红色); hasNext=true; } void PTree::PTree(整数深度){ 如果(深度==0){ 此->leftPoint=NULL; 此->右点=空; 此->hasNext=false; 返回; } sf::Vector2f oldSize=this->square.getSize(); 浮动oldL=oldSize.x; 浮点数newL=sqrt(功率(oldL,2)/2); sf::Vector2f newSize(newL,newL); sf::Vector2f point1=this->square.getPoint(0); sf::Vector2f point2=this->square.getPoint(1); sf::矩形左(新闻大小); sf::矩形形状右侧(新闻大小); 左。设置原点(0,0-newL); 右。setOrigin(newL,0-newL); 左。设置位置(点1); 右。设置位置(点2); 左。旋转(45); 右。旋转(-45); p树左(左); 产权(权利); leftPoint=&Left; rightPoint=&Right; 左。树(深度-1); 右。pTree(深度-1); } void PTree::draw(sf::RenderTarget&target,sf::RenderStates状态)常量{ 绘制(这个->正方形); 如果(!hasNext){ 返回; } PTree&leftTree=*leftPoint; PTree&rightTree=*rightPoint; leftTree.draw(target,states);//这是发生错误的地方 rightTree.draw(目标、状态); } int main(int argc,char*argv[]){ 浮动长度=atof(argv[1]); int-depth=atoi(argv[2]); 树木(长度); 树.树(深度); 浮动窗H=8*长度; 浮动窗W=12*长度; sf::RenderWindow(sf::VideoMode(windowW,windowH),“毕达哥拉斯树”); while(window.isOpen()){ sf::事件; while(window.pollEvent(事件)){ 如果(event.type==sf::event::Closed) window.close(); } window.clear(); draw(窗口,sf::RenderStates::Default); window.display(); } }_C++_Segmentation Fault_Sfml - Fatal编程技术网 leftPoint=NULL; 此->右点=空; 此->hasNext=false; 返回; } sf::Vector2f oldSize=this->square.getSize(); 浮动oldL=oldSize.x; 浮点数newL=sqrt(功率(oldL,2)/2); sf::Vector2f newSize(newL,newL); sf::Vector2f point1=this->square.getPoint(0); sf::Vector2f point2=this->square.getPoint(1); sf::矩形左(新闻大小); sf::矩形形状右侧(新闻大小); 左。设置原点(0,0-newL); 右。setOrigin(newL,0-newL); 左。设置位置(点1); 右。设置位置(点2); 左。旋转(45); 右。旋转(-45); p树左(左); 产权(权利); leftPoint=&Left; rightPoint=&Right; 左。树(深度-1); 右。pTree(深度-1); } void PTree::draw(sf::RenderTarget&target,sf::RenderStates状态)常量{ 绘制(这个->正方形); 如果(!hasNext){ 返回; } PTree&leftTree=*leftPoint; PTree&rightTree=*rightPoint; leftTree.draw(target,states);//这是发生错误的地方 rightTree.draw(目标、状态); } int main(int argc,char*argv[]){ 浮动长度=atof(argv[1]); int-depth=atoi(argv[2]); 树木(长度); 树.树(深度); 浮动窗H=8*长度; 浮动窗W=12*长度; sf::RenderWindow(sf::VideoMode(windowW,windowH),“毕达哥拉斯树”); while(window.isOpen()){ sf::事件; while(window.pollEvent(事件)){ 如果(event.type==sf::event::Closed) window.close(); } window.clear(); draw(窗口,sf::RenderStates::Default); window.display(); } },c++,segmentation-fault,sfml,C++,Segmentation Fault,Sfml" /> leftPoint=NULL; 此->右点=空; 此->hasNext=false; 返回; } sf::Vector2f oldSize=this->square.getSize(); 浮动oldL=oldSize.x; 浮点数newL=sqrt(功率(oldL,2)/2); sf::Vector2f newSize(newL,newL); sf::Vector2f point1=this->square.getPoint(0); sf::Vector2f point2=this->square.getPoint(1); sf::矩形左(新闻大小); sf::矩形形状右侧(新闻大小); 左。设置原点(0,0-newL); 右。setOrigin(newL,0-newL); 左。设置位置(点1); 右。设置位置(点2); 左。旋转(45); 右。旋转(-45); p树左(左); 产权(权利); leftPoint=&Left; rightPoint=&Right; 左。树(深度-1); 右。pTree(深度-1); } void PTree::draw(sf::RenderTarget&target,sf::RenderStates状态)常量{ 绘制(这个->正方形); 如果(!hasNext){ 返回; } PTree&leftTree=*leftPoint; PTree&rightTree=*rightPoint; leftTree.draw(target,states);//这是发生错误的地方 rightTree.draw(目标、状态); } int main(int argc,char*argv[]){ 浮动长度=atof(argv[1]); int-depth=atoi(argv[2]); 树木(长度); 树.树(深度); 浮动窗H=8*长度; 浮动窗W=12*长度; sf::RenderWindow(sf::VideoMode(windowW,windowH),“毕达哥拉斯树”); while(window.isOpen()){ sf::事件; while(window.pollEvent(事件)){ 如果(event.type==sf::event::Closed) window.close(); } window.clear(); draw(窗口,sf::RenderStates::Default); window.display(); } },c++,segmentation-fault,sfml,C++,Segmentation Fault,Sfml" />

我能';Don’不要缩小分段错误的原因 我正在使用一个程序来创建和显示一个使用C++中的SFML的PythGracas树。我创建的类继承自SFML类Drawable,该类具有纯虚拟函数“draw”,我相信segFault来自于我对该函数的定义 #include <cmath> #include <SFML/Graphics.hpp> #include <vector> class PTree: public sf::Drawable{ public: PTree(float length); PTree(sf::RectangleShape shape); ~PTree(){}; void pTree(int depth); virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; private: sf::RectangleShape square; PTree* leftPoint; PTree* rightPoint; bool hasNext; }; PTree::PTree(float length){ sf::Vector2f size(length,length); sf::RectangleShape shape(size); square = shape; square.setFillColor(sf::Color::Red); square.setPosition(5.5*length,6.5*length); hasNext = true; } PTree::PTree(sf::RectangleShape shape){ square = shape; square.setFillColor(sf::Color::Red); hasNext = true; } void PTree::pTree(int depth){ if(depth == 0){ this->leftPoint = NULL; this->rightPoint = NULL; this->hasNext = false; return; } sf::Vector2f oldSize = this->square.getSize(); float oldL = oldSize.x; float newL = sqrt(pow(oldL,2)/2); sf::Vector2f newSize(newL,newL); sf::Vector2f point1 = this->square.getPoint(0); sf::Vector2f point2 = this->square.getPoint(1); sf::RectangleShape left(newSize); sf::RectangleShape right(newSize); left.setOrigin(0,0-newL); right.setOrigin(newL,0-newL); left.setPosition(point1); right.setPosition(point2); left.rotate(45); right.rotate(-45); PTree Left(left); PTree Right(right); leftPoint = &Left; rightPoint = &Right; Left.pTree(depth-1); Right.pTree(depth-1); } void PTree::draw(sf::RenderTarget& target, sf::RenderStates states) const{ target.draw(this->square); if(!hasNext){ return; } PTree& leftTree = *leftPoint; PTree& rightTree = *rightPoint; leftTree.draw(target,states); //this is where the error occurs rightTree.draw(target,states); } int main(int argc, char* argv[]){ float length = atof(argv[1]); int depth = atoi(argv[2]); PTree tree(length); tree.pTree(depth); float windowH = 8 * length; float windowW = 12 * length; sf::RenderWindow window(sf::VideoMode(windowW,windowH), "Pythagoras Tree"); while(window.isOpen()){ sf::Event event; while(window.pollEvent(event)){ if(event.type == sf::Event::Closed) window.close(); } window.clear(); tree.draw(window,sf::RenderStates::Default); window.display(); } } #包括 #包括 #包括 类树:公共sf::可绘制{ 公众: PTree(浮动长度); PTree(sf::矩形形状); ~PTree(){}; 空隙树(内部深度); 虚拟虚空绘制(sf::RenderTarget&target,sf::RenderStates状态)常量; 私人: sf::矩形正方形; p树*左点; PTree*rightPoint; 布尔·哈斯奈特; }; PTree::PTree(浮动长度){ sf::矢量2F大小(长度、长度); sf::矩形形状(尺寸); 正方形=形状; 正方形。setFillColor(sf::Color::红色); 方形。设置位置(5.5*长度,6.5*长度); hasNext=true; } PTree::PTree(sf::矩形形状){ 正方形=形状; 正方形。setFillColor(sf::Color::红色); hasNext=true; } void PTree::PTree(整数深度){ 如果(深度==0){ 此->leftPoint=NULL; 此->右点=空; 此->hasNext=false; 返回; } sf::Vector2f oldSize=this->square.getSize(); 浮动oldL=oldSize.x; 浮点数newL=sqrt(功率(oldL,2)/2); sf::Vector2f newSize(newL,newL); sf::Vector2f point1=this->square.getPoint(0); sf::Vector2f point2=this->square.getPoint(1); sf::矩形左(新闻大小); sf::矩形形状右侧(新闻大小); 左。设置原点(0,0-newL); 右。setOrigin(newL,0-newL); 左。设置位置(点1); 右。设置位置(点2); 左。旋转(45); 右。旋转(-45); p树左(左); 产权(权利); leftPoint=&Left; rightPoint=&Right; 左。树(深度-1); 右。pTree(深度-1); } void PTree::draw(sf::RenderTarget&target,sf::RenderStates状态)常量{ 绘制(这个->正方形); 如果(!hasNext){ 返回; } PTree&leftTree=*leftPoint; PTree&rightTree=*rightPoint; leftTree.draw(target,states);//这是发生错误的地方 rightTree.draw(目标、状态); } int main(int argc,char*argv[]){ 浮动长度=atof(argv[1]); int-depth=atoi(argv[2]); 树木(长度); 树.树(深度); 浮动窗H=8*长度; 浮动窗W=12*长度; sf::RenderWindow(sf::VideoMode(windowW,windowH),“毕达哥拉斯树”); while(window.isOpen()){ sf::事件; while(window.pollEvent(事件)){ 如果(event.type==sf::event::Closed) window.close(); } window.clear(); draw(窗口,sf::RenderStates::Default); window.display(); } }

我能';Don’不要缩小分段错误的原因 我正在使用一个程序来创建和显示一个使用C++中的SFML的PythGracas树。我创建的类继承自SFML类Drawable,该类具有纯虚拟函数“draw”,我相信segFault来自于我对该函数的定义 #include <cmath> #include <SFML/Graphics.hpp> #include <vector> class PTree: public sf::Drawable{ public: PTree(float length); PTree(sf::RectangleShape shape); ~PTree(){}; void pTree(int depth); virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; private: sf::RectangleShape square; PTree* leftPoint; PTree* rightPoint; bool hasNext; }; PTree::PTree(float length){ sf::Vector2f size(length,length); sf::RectangleShape shape(size); square = shape; square.setFillColor(sf::Color::Red); square.setPosition(5.5*length,6.5*length); hasNext = true; } PTree::PTree(sf::RectangleShape shape){ square = shape; square.setFillColor(sf::Color::Red); hasNext = true; } void PTree::pTree(int depth){ if(depth == 0){ this->leftPoint = NULL; this->rightPoint = NULL; this->hasNext = false; return; } sf::Vector2f oldSize = this->square.getSize(); float oldL = oldSize.x; float newL = sqrt(pow(oldL,2)/2); sf::Vector2f newSize(newL,newL); sf::Vector2f point1 = this->square.getPoint(0); sf::Vector2f point2 = this->square.getPoint(1); sf::RectangleShape left(newSize); sf::RectangleShape right(newSize); left.setOrigin(0,0-newL); right.setOrigin(newL,0-newL); left.setPosition(point1); right.setPosition(point2); left.rotate(45); right.rotate(-45); PTree Left(left); PTree Right(right); leftPoint = &Left; rightPoint = &Right; Left.pTree(depth-1); Right.pTree(depth-1); } void PTree::draw(sf::RenderTarget& target, sf::RenderStates states) const{ target.draw(this->square); if(!hasNext){ return; } PTree& leftTree = *leftPoint; PTree& rightTree = *rightPoint; leftTree.draw(target,states); //this is where the error occurs rightTree.draw(target,states); } int main(int argc, char* argv[]){ float length = atof(argv[1]); int depth = atoi(argv[2]); PTree tree(length); tree.pTree(depth); float windowH = 8 * length; float windowW = 12 * length; sf::RenderWindow window(sf::VideoMode(windowW,windowH), "Pythagoras Tree"); while(window.isOpen()){ sf::Event event; while(window.pollEvent(event)){ if(event.type == sf::Event::Closed) window.close(); } window.clear(); tree.draw(window,sf::RenderStates::Default); window.display(); } } #包括 #包括 #包括 类树:公共sf::可绘制{ 公众: PTree(浮动长度); PTree(sf::矩形形状); ~PTree(){}; 空隙树(内部深度); 虚拟虚空绘制(sf::RenderTarget&target,sf::RenderStates状态)常量; 私人: sf::矩形正方形; p树*左点; PTree*rightPoint; 布尔·哈斯奈特; }; PTree::PTree(浮动长度){ sf::矢量2F大小(长度、长度); sf::矩形形状(尺寸); 正方形=形状; 正方形。setFillColor(sf::Color::红色); 方形。设置位置(5.5*长度,6.5*长度); hasNext=true; } PTree::PTree(sf::矩形形状){ 正方形=形状; 正方形。setFillColor(sf::Color::红色); hasNext=true; } void PTree::PTree(整数深度){ 如果(深度==0){ 此->leftPoint=NULL; 此->右点=空; 此->hasNext=false; 返回; } sf::Vector2f oldSize=this->square.getSize(); 浮动oldL=oldSize.x; 浮点数newL=sqrt(功率(oldL,2)/2); sf::Vector2f newSize(newL,newL); sf::Vector2f point1=this->square.getPoint(0); sf::Vector2f point2=this->square.getPoint(1); sf::矩形左(新闻大小); sf::矩形形状右侧(新闻大小); 左。设置原点(0,0-newL); 右。setOrigin(newL,0-newL); 左。设置位置(点1); 右。设置位置(点2); 左。旋转(45); 右。旋转(-45); p树左(左); 产权(权利); leftPoint=&Left; rightPoint=&Right; 左。树(深度-1); 右。pTree(深度-1); } void PTree::draw(sf::RenderTarget&target,sf::RenderStates状态)常量{ 绘制(这个->正方形); 如果(!hasNext){ 返回; } PTree&leftTree=*leftPoint; PTree&rightTree=*rightPoint; leftTree.draw(target,states);//这是发生错误的地方 rightTree.draw(目标、状态); } int main(int argc,char*argv[]){ 浮动长度=atof(argv[1]); int-depth=atoi(argv[2]); 树木(长度); 树.树(深度); 浮动窗H=8*长度; 浮动窗W=12*长度; sf::RenderWindow(sf::VideoMode(windowW,windowH),“毕达哥拉斯树”); while(window.isOpen()){ sf::事件; while(window.pollEvent(事件)){ 如果(event.type==sf::event::Closed) window.close(); } window.clear(); draw(窗口,sf::RenderStates::Default); window.display(); } },c++,segmentation-fault,sfml,C++,Segmentation Fault,Sfml,经过一些调试,我发现分割错误发生在leftTree.draw(target,state)行中在我的绘图功能中。我在网上到处看看,因为我还是一个初学者,我知道这种错误可能是由指针或递归引起的,我在这里同时使用这两种方法,所以我不知道我的问题是什么。但是,我在函数的开头添加了一个print语句进行测试,当我运行程序时它只打印一次,所以我假设它与指针有关,而不是递归。感谢您的帮助 您的问题是,您的指针以leftPoint和rightPoint的形式悬空 您已将这些成员点从引用分配给堆栈分配的对象,这是

经过一些调试,我发现分割错误发生在
leftTree.draw(target,state)行中在我的绘图功能中。我在网上到处看看,因为我还是一个初学者,我知道这种错误可能是由指针或递归引起的,我在这里同时使用这两种方法,所以我不知道我的问题是什么。但是,我在函数的开头添加了一个print语句进行测试,当我运行程序时它只打印一次,所以我假设它与指针有关,而不是递归。感谢您的帮助

您的问题是,您的指针以
leftPoint
rightPoint
的形式悬空

您已将这些成员点从引用分配给堆栈分配的对象,这是一个问题,因为一旦这些对象超出范围,这些引用将成为悬挂引用(它们不再指向内存中的有效位置)。这段代码显示了您在哪里执行此操作


p树左(左);//你用的是什么IDE?将调试器中的断点设置为该行,并检查树的值,以查看它们是否符合您的预期。是否
hasNext
ever
false
?如果没有,你将递归,直到你毁掉堆栈。非常感谢!只是想澄清一下,问题是,当我尝试访问draw函数中的指针时,它们指向的对象不再存在,因为它超出了范围?是的,函数完成后,您的对象就会被删除,并且在调用
draw
时早已不存在了。请查看图书链接,我特别推荐“C++编程语言”——Bjarne Stroustrup(C++的创建者),如果你有以前的编程经验,它的超级帮助,并提出很多有用的概念。这个答案在几个地方是误导的:悬空不一样。堆栈对象与垃圾收集无关。超出范围的对象不会被解除分配,也不会被删除(它们会被销毁)。等等。我同意,但我试图保持答案简单。我应该编辑它并澄清吗?