So che le variabili allocate su quella pila di una funzione diventano inaccessibili quando la funzione termina l'esecuzione. Tuttavia, i tipi di vettore allocano i loro elementi nell'heap indipendentemente dal modo in cui sono allocati. Ad esempio,È possibile passare un vettore allocato sullo "stack" dalla funzione alla funzione?
vector<int> A;
allocherà spazio per i suoi elementi nell'heap anziché nella pila.
La mia domanda è, assumere Ho il seguente codice:
int main(int argc, char *argv[]) {
// initialize a vector
vector<int> A = initVector(100000);
// do something with the vector...
return 0;
}
// initialize the vector
vector<int> initVector(int size) {
vector<int> A (size); // initialize the vector "on the stack"
// fill the vector with a sequence of numbers...
int counter = 0;
for (vector<int>::iterator i = A.begin(); i != A.end(); i++) {
(*i) = counter++;
}
return A;
}
Avrò problemi di accesso di memoria quando si utilizza il vettore A nella funzione principale? Ho provato questo più volte e hanno funzionato tutti normalmente, ma ho paura che questa potrebbe essere solo fortuna.
Il modo in cui lo vedo è che il vettore A assegna i suoi elementi all'heap, ma ha alcuni parametri "generali" (forse la dimensione del vettore) allocati nello stack stesso. Pertanto, l'utilizzo del vettore nella funzione principale potrebbe causare un problema di accesso alla memoria se questi parametri vengono sovrascritti da un'altra allocazione. Qualche idea?
Dalla tua logica, 'int add (int a, int b) {int r = a + b; return r} 'dovrebbe avere lo stesso problema che si sospetta per il proprio' initVector' ... – delnan
'vector A (size);' => 'A' risiede nello stack ma le posizioni di memoria che sta puntando risiedono nell'heap. Le posizioni di memoria contigue del 'size' sono in heap, mentre la classe vector tiene il puntatore all'elemento di inizio sull'heap. Vediamo se qualcuno mi corregge. –
Mahesh
TBH, sono stato un po 'confuso anche da questo genere di cose. Ogni volta che ho avuto qualche dubbio, ho anche assegnato il vettore, ad esempio: 'vector * a; a = nuovo vettore ; ' e quindi restituito il puntatore. –