发送堆栈上声明的变量的地址?

时间:2010-04-30 20:02:36

标签: c++

我怀疑有关声明变量,它们的范围,以及它们的地址是否可以发送到其他函数,即使它们是在堆栈中声明的?


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变量自声明为局部变量并置于堆栈后,不能再使用了。

  1. AA :: mb指针的有效性会怎样?
    它包含本地变量的地址,它不再可用,所以指针不再有效了?
  2. 如果B类是std::<vector>AA::mb不再是指向该向量的指针,而是一个向量集合本身。我希望避免将AA::f2()中的所有内容复制到行AA::mb中的成员mb = b。你会推荐哪种解决方案,因为我无法指定它,因为当程序退出AA::f2()
  3. 时它会被销毁

2 个答案:

答案 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之前,没有其他任何东西可以使用该空间。函数返回后可能引用的任何内容都必须在堆上分配。