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

stack-based pointer stored on object vector has long-life-term?

本文关键字:指针 堆栈 向量 对象 于堆栈 存储      更新时间:2023-10-16

举个例子:

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 )等指针的向量是非法的,但在这种情况下呢?

vecHold.push_back( *ptr ); 

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

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

您的代码会创建向量的副本。矢量不是通过引用自动传递的(我想不出其他任何东西)。如果您想要一个引用,那么编写代码以使用它。