1

举个例子:

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 );
} 

它是否“幸存”以调用 to Display?(并不是这就是我所说的“长期”的意思)

因为指针在下一个括号处被释放。我知道存储诸如std::vector<A*>vecHold,之类的指针的向量vecHold.push_back( ptr )是非法的,但是在这种情况下呢?

4

3 回答 3

2
vecHold.push_back( *ptr ); 

创建由ptr( ret) 指向的对象的副本,然后将其添加到 vectorvecHold中。ret是一个本地static对象,它仍然有效并且具有与程序的生命周期相同的生命周期。所以vecHold持有一个有效的对象,程序中没有不正确的东西。

于 2012-08-31T09:13:36.573 回答
0

当一个变量被声明为static函数内部时,这意味着它的生命周期将持续整个程序的时间。所以在这种情况下,返回和存储指向它的指针或引用是安全的。

于 2012-08-31T09:09:38.573 回答
0

您的代码会创建向量的副本。向量不会通过引用自动传递(我也不能想到其他任何东西)。如果您想要参考,请编写代码以使用参考。

于 2012-08-31T09:13:27.527 回答