gpt4 book ai didi

c++ - std::transform 返回的 std::pair 导致段错误

转载 作者:行者123 更新时间:2023-12-05 09:26:40 24 4
gpt4 key购买 nike

我正在尝试将字符串 vector 转换为字符串对 vector ,但遇到了段错误。我试图将它缩小到一个简单的测试用例(如下),我确信它可能与内存分配有关:

#include <string>
#include <vector>
#include <utility>

std::pair<std::string, std::string>
newP( const std::string& foo) {
return std::make_pair(std::string("Foo"), std::string("Bar"));
}

int main()
{
std::vector<std::string> vec;
std::vector<std::pair<std::string, std::string>> pairs;

vec.push_back("Hello, ");
vec.push_back("World!");

std::transform(vec.cbegin(), vec.cend(), pairs.begin(), newP);
}

我在 FreeBSD 13.1 上遇到以下段错误:

Program received signal SIGSEGV, Segmentation fault.
Address not mapped to object.
0x0000000000205fd5 in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__is_long (this=0x0) at /usr/include/c++/v1/string:1456
1456 {return bool(__r_.first().__s.__size_ & __short_mask);}
(gdb) bt
#0 0x0000000000205fd5 in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__is_long (this=0x0) at /usr/include/c++/v1/string:1456
#1 0x0000000000205f0d in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign (this=0x0, __str="Foo") at /usr/include/c++/v1/string:2463
#2 0x0000000000205ee1 in std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator= (this=0x0, __str="Foo") at /usr/include/c++/v1/string:2485
#3 0x0000000000205ded in std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::operator= (
this=0x0, __p=...) at /usr/include/c++/v1/__utility/pair.h:277
#4 0x0000000000203fe5 in std::__1::transform<std::__1::__wrap_iter<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const*>, std::__1::__wrap_iter<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >*>, std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)> (__first=..., __last=...,
__result=..., __op=0x203c20 <newP(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)>) at /usr/include/c++/v1/__algorithm/transform.h:29
#5 0x0000000000203d96 in main () at pair.cc:19

有人可以解释一下我做错了什么吗?如果可能,解决此问题的最佳方法是什么。我与现代 C++ 完全脱节。

谢谢!

最佳答案

vector pairs 为空,pairs.begin() 将返回 pairs.end() 迭代器,不能是取消引用。

在调用 transform 之前,将 pairs 的大小设置为与 vec 相同的大小:

pairs.resize(vec.size());
std::transform(vec.cbegin(), vec.cend(), pairs.begin(), newP);

已经提到的替代方法是预分配内存,然后使用 std::back_inserter附加到 vector :

pairs.reserve(vec.size());
std::transform(vec.cbegin(), vec.cend(), std::back_inserter(pairs), newP);

虽然并非严格需要调用 reserve,但它可以避免在向 vector 添加新元素时可能发生的额外重新分配和复制。

关于c++ - std::transform 返回的 std::pair 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73605841/

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