gpt4 book ai didi

C++ std::vector 插入段错误

转载 作者:太空狗 更新时间:2023-10-29 23:42:42 24 4
gpt4 key购买 nike

我正在编写一个测试程序来更好地理解vector。在其中一种情况下,我试图将一个值 insert 到 vector 中的指定位置。代码编译干净。但是,在执行时,它从 v8.insert(..) 行抛出一个 Segmentation Fault(见下面的代码)。我很困惑。有人可以指出我的代码有什么问题吗?

#define UNIT_TEST(x) assert(x)
#define ENSURE(x) assert(x)

#include <vector>
typedef std::vector< int > intVector;
typedef std::vector< int >::iterator intVectorIterator;
typedef std::vector< int >::const_iterator intVectorConstIterator;


intVectorIterator find( intVector v, int key );
void test_insert();

intVectorIterator
find( intVector v, int key )
{
for( intVectorIterator it = v.begin(); it != v.end(); ++it )
{
if( *it == key )
{
return it;
}
}

return v.end();
}

void
test_insert()
{
const int values[] = {10, 20, 30, 40, 50};
const size_t valuesLength = sizeof( values ) / sizeof( values[ 0 ] );
size_t index = 0;
const int insertValue = 5;

intVector v8;
for( index = 0; index < valuesLength; ++index )
{
v8.push_back( values[ index ] );
}

ENSURE( v8.size() == valuesLength );
for( index = 0; index < valuesLength; ++index )
{
printf( "index = %u\n", index );

intVectorIterator it = find( v8, values[ index ] );
ENSURE( it != v8.end() );
ENSURE( *it == values[ index ] );

// intVectorIterator itToInsertedItem =
v8.insert( it, insertValue ); // line 51
// UNIT_TEST( *itToInsertedItem == insertValue );
}
}

int main()
{
test_insert();
return 0;
}

$ ./a.out
index = 0
Segmentation Fault (core dumped)

(gdb) bt
#0 0xff3a03ec in memmove () from /platform/SUNW,T5140/lib/libc_psr.so.1
#1 0x00012064 in std::__copy_move_backward<false, true, std::random_access_iterator_tag>::__copy_move_b<int> (__first=0x23e48, __last=0x23450, __result=0x23454)
at /local/gcc/4.4.1/lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++/4.4.1/bits/stl_algobase.h:575
#2 0x00011f08 in std::__copy_move_backward_a<false, int*, int*> (__first=0x23e48, __last=0x23450, __result=0x23454)
at /local/gcc/4.4.1/lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++/4.4.1/bits/stl_algobase.h:595
#3 0x00011d00 in std::__copy_move_backward_a2<false, int*, int*> (__first=0x23e48, __last=0x23450, __result=0x23454)
at /local/gcc/4.4.1/lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++/4.4.1/bits/stl_algobase.h:605
#4 0x000119b8 in std::copy_backward<int*, int*> (__first=0x23e48, __last=0x23450, __result=0x23454) at /local/gcc/4.4.1/lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++/4.4.1/bits/stl_algobase.h:640
#5 0x000113ac in std::vector<int, std::allocator<int> >::_M_insert_aux (this=0xffbfeba0, __position=..., __x=@0xffbfebac)
at /local/gcc/4.4.1/lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++/4.4.1/bits/vector.tcc:308
#6 0x00011120 in std::vector<int, std::allocator<int> >::insert (this=0xffbfeba0, __position=..., __x=@0xffbfebac)
at /local/gcc/4.4.1/lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++/4.4.1/bits/vector.tcc:126
#7 0x00010bc0 in test_insert () at vector_insert_test.cpp:51
#8 0x00010c48 in main () at vector_insert_test.cpp:58
(gdb) q

最佳答案

您正在将 v8 按值传递给您的 find 函数。因此,返回的迭代器指向 vector 的拷贝,该拷贝在查找调用返回后超出范围。尝试通过 (const) 引用传递,或者更好的是,只需使用 std::find

关于C++ std::vector 插入段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806370/

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