标签:c vector runtime-error stdvector
我正在经历一些使用构造函数填充向量值的“奇怪行为”.
所以,我有这个块类,只要调用构造函数,就会填充这个名为blockList的静态向量.
static std::vector<Block*> blockList;
Block::Block(float x, float y)
: RectangleShape(sf::Vector2f(WIDTH, HEIGHT)) {
blockList.push_back(this);
setFillColor(sf::Color(221, 221, 221, 255));
setPosition(x, y);
}
现在,当我在另一个类中填充值时,我称之为“游戏”;在它的构造函数中如下:
Game::Game(sf::RenderWindow& window) {
// other code here
Block firstBlock(10, 10);
// possible more blocks here
}
然后试图画画,它崩溃了.另外,该块的坐标打印为(x:9.8439e-12,y:9.84394e-12).现在我尝试做的是把它扔进draw方法(我知道它很糟糕,因为它经常被调用但是出于调试目的):
void Game::drawObjects() {
// draw other shapes here
Block oneBlock(50.0f, 50.0f);
std::cout << std::string(10, '-') << std::endl;
for (Block* block : Block::getBlockList()) {
std::cout << block->getPosition().x << " - " << block->getPosition().y << std::endl;
window->draw(*block);
}
std::cout << std::string(10, '-') << std::endl;
}
对象的坐标和绘图完美地工作(即使矢量被大量填充).所以我想知道为什么会这样,并且可以解决这个问题.我不喜欢这个想法,但也许我应该有标志来检测它们是否已经被创建然后在draw方法中创建它们?
解决方法:
So I’m wondering why this is happening
在Game :: Game()中,Block firstBlock(10,10);表示firstBlock是一个本地对象,当它超出Game :: Game()的范围时将被销毁.然后由blockList.push_back(this)保存指针;在blockList中变为悬空指针,访问它导致UB.
and a possible way to work around this.
你真的需要一个指针向量吗?你可以
static std::vector<Block> blockList;
然后使用它像:
Block firstBlock(10, 10);
blockList.push_back(firstBlock);
标签:c,vector,runtime-error,stdvector 来源: https://codeday.me/bug/20190724/1524787.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。