存储在对象向量上的基于堆栈的指针具有很长的使用寿命
stack-based pointer stored on object vector has long-life-term?
举个例子:
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 )
等指针的向量是非法的,但在这种情况下呢?
vecHold.push_back( *ptr );
创建ptr
(ret
)指向的对象的副本,然后将其添加到向量vecHold
中。ret
是一个本地static
对象,它仍然有效,其生存期与程序的生存期相同。所以vecHold
持有一个有效的对象,并且程序中没有任何不正确的w.r.t。
当一个变量在函数内声明为static
时,意味着它的生命周期将持续整个程序。因此,在这种情况下,返回并存储指向它的指针或引用是安全的。
您的代码会创建向量的副本。矢量不是通过引用自动传递的(我想不出其他任何东西)。如果您想要一个引用,那么编写代码以使用它。
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 使用指针计算堆栈问题的大 O 表示法
- 作为指针注入类后重新创建堆栈对象不好吗?
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 如何按指针查看堆栈跟踪
- 堆栈/帧指针作为外部变量
- 未分配被释放的指针(将堆栈实现为链表时)
- 唯一指针是否在堆或堆栈上分配内存?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 复制堆栈上的成员值或使用指针访问它?
- 堆栈对象的强制转换指针
- 如果堆栈在数字较低的地址增长,为什么指针比较会逆转这种情况?
- C++对自动(堆栈)指针使用运算符删除
- 如果没有指针,如何识别堆栈上的内存?
- 我如何转换一个基于动态的,基于指针的int堆栈,以便将其打印成字符串
- C++设置堆栈指针
- 为什么在非指针堆栈分配变量上调用 delete 时C++不给出编译器错误?
- 指向C++中对象的指针 - 堆栈/堆上有什么?
- 如何使用指向数组的指针堆栈,以及在同一命令中访问两个数组