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 в стеке, если аргумент был нулевым указателем?
Будет ли эта функция делать то, что я думаю?
Нет, это неопределенное поведение, потому что 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);
}
}
Вы объявляете B типа B в фигурных скобках, что означает, что он будет действителен только в пределах этого условного оператора if, то есть вышел из области видимости. Объявите B перед оператором if.
B будет назначен только тогда, когда ptr_to_A равен нулю.
Если вы намереваетесь передать ptr_to_A из функции «function ()», у вас будут проблемы, поскольку B является локальной функцией.