gpt4 book ai didi

c++ - 调用 vector.erase() 时出现段错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:28 28 4
gpt4 key购买 nike

每当我调用dominoes.erase()这是类型 std::vector<Domino>我遇到了段错误;即使我硬编码值。

一个单独的成员函数调用dominoes.push_back()加载数据,我可以使用 pop_back()从 vector 中删除并返回多米诺骨牌,所以我知道那里有数据。我在 Domino 对象上创建了一个复制构造函数,它工作得很好。我已将范围缩小到 dominoes.erase() .

Domino::Domino( const Domino &d ) {
left = d.getHighPip();
right = d.getLowPip();

}
Domino DominoCollection::drawDomino( void )
{

int index = random.nextNumber( dominoes.size() );
Domino d( dominoes[index] );
dominoes.erase( dominoes.begin() + index );

return Domino( d );
}

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

尝试通过删除所有不必要的代码(对象复制、 vector 访问...)来缩小错误范围。然后,如果问题确实来自 erase,请添加保护以确保索引正确。使用此代码重试:

#include <cassert>
void DominoCollection::drawDomino( void )
{
assert(dominoes.size() != 0 && "Your vector is empty");
int index = random.nextNumber( dominoes.size() );
assert(index < dominoes.size() && "Buffer overflow...");
dominoes.erase( dominoes.begin() + index );
}

如果仍然出现段错误,则问题出在 Domino 类的析构函数中。看看那里有没有可疑的东西。您可以通过注释部分(或全部)析构函数来进行快速测试,以了解问题出在哪里。调用 erase 将调用 Domino 的析构函数。

如果未实现析构函数,最好实现一个带有输出的析构函数(在 cerr 上,而不是 cout 上)以了解它是否得到那里或早些时候崩溃。 Domino 是派生类吗?它是否有任何其他对象,或者只有原始类型的组合?

编辑

我快速浏览了你的代码:问题出在赋值运算符上:

Domino & Domino::operator = ( const Domino & d )
{
*this = d;
}

应该这样写......我让你调试它作为练习。

至于为什么这是错误的来源:你说 erase 崩溃但不是 pop_back。两者之间的主要区别(实现差异,不是明显的语义差异)是删除导致所有元素在删除后移动(使用 = 运算符),因为 std::vector 要求元素连续存储。而 pop 仅更改尾部指针,而不会更改容器的其余部分。

关于c++ - 调用 vector.erase() 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135874/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com