c++ - técnicas - Al insertar direcciones en conjuntos, el tamaño de los conjuntos es menor que el esperado
memoria cache definicion pdf (2)
El parámetro a
se pasa por valor, lo que significa que lo que está insertando es la dirección del parámetro local copiado de los argumentos. a
se construirá cada vez que se llame func
, sus direcciones pueden ser iguales o diferentes; nada esta garantizado
Y vale la pena señalar que el parámetro a
se destruirá cuando salga de la función, luego los punteros insertados se pondrán en suspenso.
Debe hacerlo paso por referencia, luego se insertarán las direcciones de los argumentos (es decir, la variable a
, b
, c
, d
en main()
). Estas direcciones son diferentes y no se colgarán dentro del cuerpo de main()
.
void func(set<int*>& s1, set<int*>& s2, int& a)
{
s1.insert(&a);
s2.insert(&a);
}
Estoy obteniendo un tamaño de 1. ¿No debería ser 4? Estoy insertando las direcciones de enteros en los conjuntos.
void func(set<int*>& s1, set<int*>& s2, int a)
{
s1.insert(&a);
s2.insert(&a);
}
int main()
{
set<int*> s1, s2;
int a = 1, b = 2, c = 3, d = 4;
func(s1, s2, a);
func(s1, s2, b);
func(s1, s2, c);
func(s1, s2, d);
cout<<" s1.size = "<<s1.size()<<" s2.size = "<<s2.size()<<endl;
}
&a
func
interno es la dirección del parámetro local a
, no la dirección de la variable original ( a
, b
, c
o d
), que:
- Puede tomar varios tipos de valores entre diferentes llamadas de
func
; - Se convierte en un puntero no válido una vez que llega al final del ámbito en el que se declara a (el final de la
func
aquí).
En su caso, como no hace nada más que llamar a la func
4 veces seguidas, la dirección de este parámetro no cambia, por lo que obtiene un tamaño de 1 (inserta el mismo puntero 4 veces).
Este comportamiento está definido en la implementación (gracias @ Rakete1111) ya que los conjuntos necesitarán comparar punteros no válidos.
El acceso al elemento puntiagudo a través de s1
o s2
(por ejemplo, **s1.begin()
) es un comportamiento indefinido.