0
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 ?

4

2 回答 2

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

但是如果你只想分配一个typeBif ptr_to_Ais null 那么你可以这样做:

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);
  }
}
于 2012-10-17T01:07:13.763 回答
0

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

于 2012-10-17T01:04:34.593 回答