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?
答案 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是函数本地的。