我编写了一组相当复杂的类来处理迭代流(字符串、文件或内存)。这些不是标准流,也不是相关的。无论如何,由于迭代这些缓冲区并根据缓冲区执行操作,我希望能够在调试器中看到当前缓冲区位置。因此,仅出于调试原因,我将整个流复制到一个向量并持有一个指向该向量中某个位置的指针。
下面的代码就像一个前向迭代器。我需要能够存储一个位置,然后使用它或更新它。请注意,此代码仅用于复制问题。
class foo
{
public:
foo ( std::string szTemp )
: nOffset( 0 )
{
vec.resize( szTemp.size() );
std::memcpy( &vec[ 0 ], szTemp.c_str(), szTemp.size() );
pChar = &vec[ 0 ];
}
foo( const foo & Other )
: vec( Other.vec )
, nOffset( Other.nOffset )
{
pChar = &vec[ nOffset ];
}
void Inc ( void )
{
++nOffset;
pChar = &vec[ nOffset ];
}
size_t nOffset;
char * pChar;
std::vector< char > vec;
};
int _tmain ( int argc, _TCHAR* argv[] )
{
foo a( "This is a temp string" );
a.Inc();
{
foo b = a;
b.Inc();
a = b;
} // Here is where the problem is seen
a.Inc();
}
问题,将 b 复制回 a 然后退出后, b.pChar 的值变得非法。
据我了解,b 从 a 复制向量,然后 a 又从 b 复制回来。因为我在这个副本之后设置了 pChar 的值,所以它“应该”总是指向某个东西。但是,它的行为就像向量正在被破坏。
这是怎么回事?