存储在对象向量上的基于堆栈的指针具有长寿命?

时间:2012-08-31 09:03:33

标签: c++ vector stack heap

举例:

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*>vecHoldvecHold.push_back( ptr )之类指针的向量是非法的,但在这种情况下呢?

3 个答案:

答案 0 :(得分:2)

vecHold.push_back( *ptr ); 

创建ptrret)指向的对象的副本,然后将其添加到向量vecHold中。 ret是一个本地static对象,它仍然有效,其生命周期与程序的生命周期相同。所以vecHold拥有一个有效的对象,程序中没有任何错误的w.r.t.

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的代码会创建矢量的副本。矢量不会通过引用自动传递(也不是我能想到的任何其他内容)。如果你想要一个引用,那么编写代码来使用它。