C + + excluir vetor, objects, memory livre

Estou totalmente confuso com relação à exclusão de coisas em C ++ Se eu declarar uma matriz de objects e se eu usar a function clear() . Posso ter certeza de que a memory foi liberada?

Por exemplo :

 tempObject obj1; tempObject obj2; vector tempVector; tempVector.pushback(obj1); tempVector.pushback(obj2); 

Posso ligar com segurança para liberar toda a memory? Ou preciso fazer uma iteração para excluir um por um?

 tempVector.clear(); 

Se este cenário for alterado para um ponteiro de objects, a resposta será a mesma que acima?

 vector *tempVector; //push objects.... tempVector->clear(); 

Você pode chamar claro, e isso destruirá todos os objects, mas isso não liberará a memory. Looping através dos elementos individuais também não ajudará (que ação você mesmo propor para assumir os objects?) O que você pode fazer é isto:

 vector().swap(tempVector); 

Isso irá criar um vetor vazio sem memory alocada e trocá-lo com tempVector, efetivamente desalocando a memory.

O C ++ 11 também tem a function shrink_to_fit , que você poderia chamar após a chamada para clear (), e teoricamente diminuiria a capacidade de ajustar o tamanho (que agora é 0). Este é, no entanto, um pedido não vinculativo, e sua implementação está livre para ignorá-lo.

Existem duas coisas separadas aqui:

  1. vida útil do object
  2. duração de armazenamento

Por exemplo:

 { vector v; // do some stuff, push some objects onto v v.clear(); // 1 // maybe do some more stuff } // 2 

Em 1 , você limpa v : isso destrói todos os objects que estava armazenando. Cada um recebe seu destruidor chamado, se você escreveu um, e qualquer coisa pertencente a esse MyObject agora é liberada. No entanto , o vetor v tem o direito de manter o armazenamento bruto no caso de você desejar mais tarde.

Se você decidir colocar mais algumas coisas entre 1 e 2 , isso economiza tempo, pois pode reutilizar a memory antiga.

Em 2 , o vetor v sai do escopo: qualquer object que você tenha empurrado para ele desde que 1 será destruído (como se você tivesse explicitamente chamado clear novamente), mas agora o armazenamento subjacente também é liberado ( v não estará disponível para reutilizá-lo mais).


Se eu mudar o exemplo para v se tornar um ponteiro, você precisa explicitamente deletá-lo, já que o ponteiro saindo do escopo em 2 não faz isso para você. É melhor usar algo como std::unique_ptr nesse caso, mas se você não fizer isso e v for divulgado, o armazenamento alocado também será divulgado. Como acima, você precisa ter certeza de que v é excluído e chamar clear não é suficiente.

vector::clear() não libera memory alocada pelo vetor para armazenar objects; chama destruidores para os objects que possui.

Por exemplo, se o vetor usa uma matriz como um armazenamento de apoio e atualmente contém 10 elementos, então chamar clear() chamará o destruidor de cada object na matriz, mas a matriz de apoio não será desalocada , portanto ainda existe sizeof(T) * 10 bytes alocados ao vetor (pelo menos). size() será 0, mas size() retorna o número de elementos no vetor, não necessariamente o tamanho do armazenamento de apoio.

Quanto à sua segunda pergunta, qualquer coisa que você alocar com new você deve desalocar com delete . Você normalmente não mantém um ponteiro para um vetor por esse motivo. Raramente há (se alguma vez) uma boa razão para fazer isso e você evita que o vetor seja limpo quando sai do escopo. No entanto, chamar clear() ainda funcionará da mesma maneira, independentemente de como foi alocado.

Se você precisar usar o vetor repetidas vezes e seu código atual o declarar repetidamente em seu loop ou em todas as chamadas de function, é provável que você fique sem memory. Eu sugiro que você o declare fora, passe-os como pointers em suas funções e use:

 my_arr.resize() 

Dessa forma, você continua usando a mesma sequência de memory para seus vetores, em vez de solicitar novas sequências todas as vezes. Espero que isso tenha ajudado. Nota: redimensioná-lo para tamanhos diferentes pode adicionar valores randoms. Passe um inteiro como 0 para inicializá-los, se necessário.