条件自动变量

时间:2012-10-17 00:59:18

标签: c++ memory memory-management callstack

void function(typeA* ptr_to_A) {
  if (!ptr_to_A) {
    typeB B; // typeB is a derived class of typeA
    ptr_to_A = &B;
  }
  do_stuff_to_ptr_to_A(ptr_to_A);
  // my hope is that B is still in scope here so that this function will operate on my B object (which is on the stack) which only gets created if ptr_to_A was initially NULL
}

这个功能会做我认为它做的事情(我想要它做什么)?也就是说,如果参数是空指针,只在堆栈上分配B?

2 个答案:

答案 0 :(得分:1)

  

这个功能会做我认为的吗?

不,这是未定义的行为,因为B超出了范围。由于这是未定义的行为,任何事情都可能发生,因此您无法预测结果。您希望将B保留在与函数调用至少相同的范围内,因此只需将其移至方法的顶部:

void function(typeA* ptr_to_A) {
   typeB B; // typeB is a derived class of typeA
   if (!ptr_to_A) {
      ptr_to_A = &B;
   }
   do_stuff_to_ptr_to_A(ptr_to_A);
}

但如果您只想分配一个typeB如果ptr_to_A为空,那么您可以这样做:

void function(typeA* ptr_to_A) {
  if (!ptr_to_A) {
    typeB B; // typeB is a derived class of typeA
    do_stuff_to_ptr_to_A(&B);
  } else {
    do_stuff_to_ptr_to_A(ptr_to_A);
  }
}

答案 1 :(得分:0)

您在大括号内声明B类型B,这意味着它只在该条件if语句中有效,即超出范围。在if语句之前声明B. 只有在ptr_to_A为空时才会分配B. 如果你打算将ptr_to_A传递给函数“function()”,那么你将遇到麻烦,因为B是函数本地的。