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

への呼び出しに対して「存続」しDisplayますか? (これが「長寿命」という意味ではありません)

ポインターは次のブラケットで解放されるためです。std::vector<A*>vecHold、などのポインターを格納するベクトルvecHold.push_back( ptr )が不正であることはわかっていますが、この場合はどうでしょうか。

4

3 に答える 3

2
vecHold.push_back( *ptr ); 

ptr( )が指すオブジェクトのコピーを作成し、retそれを vector に追加しvecHoldます。有効なままであり、プログラムの存続期間と同じ存続期間を持つretローカルオブジェクトです。staticしたがってvecHold、有効なオブジェクトを保持し、プログラムに間違ったものはありません。

于 2012-08-31T09:13:36.573 に答える
0

コードはベクターのコピーを作成します。ベクトルは参照によって自動的に渡されません (私が考えることができるものもありません)。参照が必要な場合は、それを使用するコードを記述します。

于 2012-08-31T09:13:27.527 に答える
0

変数がstatic関数内で宣言されている場合、その有効期間はプログラムの全期間続くことを意味します。したがって、この場合、ポインターまたは参照を返して保存しても安全です。

于 2012-08-31T09:09:38.573 に答える