举例:
class A
{
public:
int value;
A():value(1){};
~A(){};
};
void Display( std::vector<A> myvector )
{
for( std::vector<A>::iterator it = myvector.begin(); it!= myvector.end(); ++it )
std::cout << (*it).value << std::endl;
}
A* GetAtId( DWORD id )
{
if( id != 0 )
{
static A ret;
return& ret;
}
return NULL;
}
void Serialize( DWORD obj[3] )
{
std::vector<A> vecHold;
for( int i=0; i<3; i++ )
{
A* ptr = NULL;
if( obj[i] != 0 )
{
ptr = GetAtId( obj[i] );
if( ptr ) vecHold.push_back( *ptr );
}
}
Display( vecHold );
}
int main( )
{
DWORD id[3] = {0,};
id[2] = 9;
Serialize( id );
}
拨打Display
是否“幸存”? (这不是我所说的'长寿期')
因为指针在下一个括号处被释放。
我知道存储诸如std::vector<A*>vecHold
,vecHold.push_back( ptr )
之类指针的向量是非法的,但在这种情况下呢?
答案 0 :(得分:2)
vecHold.push_back( *ptr );
创建ptr
(ret
)指向的对象的副本,然后将其添加到向量vecHold
中。 ret
是一个本地static
对象,它仍然有效,其生命周期与程序的生命周期相同。所以vecHold
拥有一个有效的对象,程序中没有任何错误的w.r.t.
答案 1 :(得分:0)
当变量在函数内声明为static
时,意味着它的生命周期将持续整个程序。因此,在这种情况下,返回并存储指针或引用是安全的。
答案 2 :(得分:0)
您的代码会创建矢量的副本。矢量不会通过引用自动传递(也不是我能想到的任何其他内容)。如果你想要一个引用,那么编写代码来使用它。