C++: get error: std::bad_alloc when using vector and iterator
C++: get error: std::bad_alloc when using vector and iterator
我正在使用 mailio library,当我想获取向量中的所有元素时遇到了麻烦。
string msg = "Subject: " + mail -> subject() + "\nFrom: ";
for(auto address = ( mail -> from() ).addresses.begin(); address != ( mail -> from() ).addresses.end(); ++address ){ //address is not empty
msg.append( address -> name );// <----here
}
这里是 class message
的简要定义:
class MAILIO_EXPORT message : public mime
{
...
public:
mailboxes from() const;
...
}
struct MAILIO_EXPORT mailboxes
{
...
std::vector<mail_address> addresses;
...
}
struct MAILIO_EXPORT mail_address
{
...
std::string name;
...
}
程序终止,returnsget error: std::bad_alloc
。我不知道出了什么问题,但我仍然设法用以下代码解决了它:
string msg = "Subject: " + mail -> subject() + "\nFrom: ";
auto add = ( mail -> from() ).addresses;
for(auto address = add.begin(); address != add.end(); ++address ){
msg.append( address -> name );
}
也许我试图无意识地修改其中一个或一些const值。但我不是。
如果 from()
不是 return 引用,那么它会复制结构,包括复制 std::vector
。这意味着在你的循环中你得到 两个不同的 向量,你分别使用 begin()
和 end()
。不允许在它们之间循环,因为开始迭代器很可能永远不会匹配结束,尤其是在越界之前。
在第二个代码中有一个副本,你使用它的迭代器,这样它们就可以工作了。
我正在使用 mailio library,当我想获取向量中的所有元素时遇到了麻烦。
string msg = "Subject: " + mail -> subject() + "\nFrom: ";
for(auto address = ( mail -> from() ).addresses.begin(); address != ( mail -> from() ).addresses.end(); ++address ){ //address is not empty
msg.append( address -> name );// <----here
}
这里是 class message
的简要定义:
class MAILIO_EXPORT message : public mime
{
...
public:
mailboxes from() const;
...
}
struct MAILIO_EXPORT mailboxes
{
...
std::vector<mail_address> addresses;
...
}
struct MAILIO_EXPORT mail_address
{
...
std::string name;
...
}
程序终止,returnsget error: std::bad_alloc
。我不知道出了什么问题,但我仍然设法用以下代码解决了它:
string msg = "Subject: " + mail -> subject() + "\nFrom: ";
auto add = ( mail -> from() ).addresses;
for(auto address = add.begin(); address != add.end(); ++address ){
msg.append( address -> name );
}
也许我试图无意识地修改其中一个或一些const值。但我不是。
如果 from()
不是 return 引用,那么它会复制结构,包括复制 std::vector
。这意味着在你的循环中你得到 两个不同的 向量,你分别使用 begin()
和 end()
。不允许在它们之间循环,因为开始迭代器很可能永远不会匹配结束,尤其是在越界之前。
在第二个代码中有一个副本,你使用它的迭代器,这样它们就可以工作了。