- ある開発者の覚書 - ソフトウェア開発者が情報処理に関する雑多な話題をジャンルを問わずに書き留めています.未来の私、私と同類のgeekたちへ

2009-03-29

boost::tokenizer はコンテナのコピーを作成しない

一時オブジェクトを渡すと後でイテレータアクセスの際にアクセスバイオレーションになります。ご注意を

#include "stdafx.h"
#include <iostream>
#include <boost/tokenizer.hpp>

std::string funcReturnsString()
{
std::string ret = "hogege,gehoho";
return ret;
}

int _tmain(int argc, _TCHAR* argv[])
{
boost::char_separator<char> sep(",");
typedef boost::tokenizer< boost::char_separator<char> > CommaTokenizer;

//NG
CommaTokenizer tokens(funcReturnsString(), sep);
for(CommaTokenizer::const_iterator it = tokens.begin(); it != tokens.end(); it++){
std::cout<<*it<<std::endl;
}

//OK
std::string str = funcReturnsString();
CommaTokenizer tokens(str, sep);
for(CommaTokenizer::const_iterator it = tokens.begin(); it != tokens.end(); it++){
std::cout<<*it<<std::endl;
}

return 0;
}

0 件のコメント:

ブログ アーカイブ