我怀疑有关声明变量,它们的范围,以及它们的地址是否可以发送到其他函数,即使它们是在堆栈中声明的?
class A{
AA a;
void f1(){
B b;
aa.f2(&b);
}
};
class AA{
B* mb;
f2(B* b){
mb = b;
//...
}
};
之后,我在代码中使用了AA::mb
指针。
所以我想知道的事情如下。 A::f1()
函数时,b
变量自声明为局部变量并置于堆栈后,不能再使用了。
B
类是std::<vector>
,AA::mb
不再是指向该向量的指针,而是一个向量集合本身。我希望避免将AA::f2()
中的所有内容复制到行AA::mb
中的成员mb = b
。你会推荐哪种解决方案,因为我无法指定它,因为当程序退出AA::f2()
答案 0 :(得分:5)
它包含本地变量的地址,该地址变量不再可用,所以指针不再有效了?
是。它变成了一个悬垂的指针。
您可以尝试vector::swap
,如:
class AA {
B mb; // not a pointer
f2(B* b){
mb.swap(*b); // swap the content with b, which is just a few pointer assignments.
答案 1 :(得分:2)
变量的地址是指针。如果变量是在堆栈上分配的,那么指针指向堆栈上的某个地址。当函数返回时,调用的下一个函数(或某个将来的函数)会在堆栈的同一位置创建局部变量。指针没有发生任何变化,但指向的数据现在已经改变了。
使用new或malloc分配内存时,需要在堆中保留空间。在您调用delete或free之前,没有其他任何东西可以使用该空间。函数返回后可能引用的任何内容都必须在堆上分配。