Grazie per aver controllato la mia domanda. Ho appena riscontrato un problema davvero fondamentale quando sto implementando un BST, ovvero "qual è la differenza nei diversi approcci per assegnare un puntatore?" Sappiamo tutti che assegna un punto può utilizzare:Qual è la differenza tra le modalità di assegnazione di un puntatore?
int *p, q;
p = &q;
Oppure:
int *p, *q;
p = q;
Dovrebbero essere gli stessi. Ma nel mio caso al di sotto, si lavora totalmente differente:
template <typename T>
void Tree<T>::_insert(TreeNode<T>*& tree, const T& value, const unsigned& key)
{
// TreeNode<T> node(value, key);
// if(tree == nullptr) tree = &node;
TreeNode<T> *node = new TreeNode<T>(value, key);
if(tree == nullptr) tree = node;
else if(key < tree->index) _insert(tree->left, value, key);
else if(key > tree->index) _insert(tree->right, value, key);
else if(key == tree->index) std::cerr << "_insert: repeating key" << std::endl;
}
Utilizzando il primo modo (rilevato uno), la funzione non assegnerà albero uguale a node, mentre il secondo modo funziona bene.
Quindi, questa è colpa mia, o sono naturalmente diversi?
Grazie per la vostra risposta, lo apprezzo molto. Quindi, se ho capito bene, il motivo per cui ho ottenuto un errore è perché la variabile dichiarata nell'heap verrà liberata quando supera l'ambito, quindi, nel primo caso, il "nodo" verrà liberato e il puntatore "albero" verrà reimpostato in "nullptr", giusto? –
@XiangyuZhang No, la memoria allocata nell'heap non verrà liberata a meno che non lo facciate esplicitamente (ecco perché non avete avuto problemi nel secondo caso). Per il primo caso, il puntatore "tree" non verrà reimpostato su "nullptr" una volta che il frame stack di _insert è spuntato, rimarrà comunque quello che era, ma poiché _insert() è tornato, quale "albero" punta a è solo una memoria casuale (lo stack frame delle seguenti chiamate di funzioni sovrascrive la memoria dello stack allocata), il dereferenziamento/accesso al puntatore "tree" è certamente problematico. –
@XiangyuZhang Forse è utile guardare https://en.wikipedia.org/wiki/Call_stack#STACK-FRAME –