Qual é a diferença entre delete
e delete[]
operadores em C ++?
c++
memory-management
delete-operator
shreyasva
fonte
fonte
vector<>
vez de uma matriz sempre que posso.std::unique_ptr<int>(new int[3])
, por exemplo , porque ele chamará regularmentedelete
a matriz, que é um comportamento indefinido. Em vez disso, você precisa usarstd::unique_ptr<int[]>
Respostas:
O
delete
operador desaloca a memória e chama o destruidor para um único objeto criado comnew
.O
delete []
operador desaloca a memória e chama destruidores para uma matriz de objetos criadosnew []
.O uso
delete
de um ponteiro retornado pornew []
oudelete []
em um ponteiro retornadonew
resulta em comportamento indefinido.fonte
O
delete[]
operador é usado para excluir matrizes. Odelete
operador é usado para excluir objetos que não são da matriz. Ele chamaoperator delete[]
eoperator delete
funciona, respectivamente, para excluir a memória que o objeto da matriz ou não matriz ocupou após (eventualmente) chamar os destruidores dos elementos da matriz ou do objeto que não é da matriz.O seguinte mostra as relações:
Para o
new
que cria uma matriz (portanto,new type[]
ounew
aplicada a uma construção de tipo de matriz), o Padrão procura umoperator new[]
na classe de tipo de elemento da matriz ou no escopo global e passa a quantidade de memória solicitada. Ele pode solicitar mais doN * sizeof(ElementType)
que deseja (por exemplo, armazenar o número de elementos, portanto, mais tarde, ao excluir, sabe quantas chamadas de destruidor devem ser feitas). Se a classe declararoperator new[]
que um adicional à quantidade de memória aceita outrosize_t
, esse segundo parâmetro receberá o número de elementos alocados - poderá usá-lo para qualquer finalidade que desejar (depuração, etc ...).Para o
new
que cria um objeto que não é de matriz, ele procurará umoperator new
na classe do elemento ou no escopo global. Passa a quantidade de memória solicitada (exatamentesizeof(T)
sempre).Para o
delete[]
, ele examina o tipo de classe de elemento dos arrays e chama seus destruidores. Aoperator delete[]
função usada é a da classe do tipo de elemento ou, se não houver, no escopo global.Para o
delete
, se o ponteiro passado é uma classe base do tipo de objeto real, a classe base deve ter um destruidor virtual (caso contrário, o comportamento é indefinido). Se não for uma classe base, o destruidor dessa classe será chamado e umoperator delete
nessa classe ou no globaloperator delete
será usado. Se uma classe base foi aprovada, o destruidor do tipo de objeto real é chamado e ooperator delete
encontrado nessa classe é usado, ou, se não houver, um globaloperator delete
é chamado. Se ooperator delete
na classe tiver um segundo parâmetro do tiposize_t
, ele receberá o número de elementos a serem desalocados.fonte
Esse é o uso básico do padrão alocar / DE-alocar em c ++
malloc
/free
,new
/delete
,new[]
/delete[]
Precisamos usá-los correspondentemente. Mas eu gostaria de acrescentar esse entendimento específico para a diferença entre
delete
edelete[]
1)
delete
é usado para desalocar a memória alocada para um único objeto2)
delete[]
é usado para desalocar a memória alocada para a matriz de objetosquando dizemos
new ABC[100]
, o compilador pode obter as informações sobre quantos objetos precisam ser alocados (aqui é 100) e chamará o construtor para cada um dos objetos criadosmas correspondentemente se simplesmente usarmos
delete ptr
nesse caso, o compilador não saberá quantos objetosptr
estão apontando e acabará chamando o destruidor e excluindo a memória para apenas 1 objeto (deixando a invocação de destruidores e desalocação dos 99 objetos restantes). Portanto, haverá um vazamento de memória.então precisamos usar
delete [] ptr
neste caso.fonte
free()
isso e aquilo. Se você usar um padrão pseudo-destruidor, precisará chamá-lo uma vez para cada objeto usando umfor
loop.Os operadores
delete
edelete []
são usados respectivamente para destruir os objetos criados comnew
enew[]
, retornando à memória alocada deixada disponível para o gerenciador de memória do compilador.Os objetos criados com
new
devem necessariamente ser destruídos comdelete
e as matrizes criadas comnew[]
devem ser excluídas comdelete[]
.fonte
Quando eu fiz essa pergunta, minha verdadeira pergunta era: "existe uma diferença entre os dois? O tempo de execução não precisa manter informações sobre o tamanho da matriz e, portanto, não será capaz de dizer qual deles queremos dizer?" Esta pergunta não aparece em "perguntas relacionadas"; portanto, apenas para ajudar pessoas como eu, aqui está a resposta: "por que precisamos do operador delete []?"
fonte
delete
é usado para um único ponteiro edelete[]
é usado para excluir uma matriz por meio de um ponteiro. Isso pode ajudá-lo a entender melhor.fonte
Bem ... talvez eu pense que é apenas por explícito. O operador
delete
e o operadordelete[]
se distinguem, mas odelete
operador também pode liberar a matriz.E já verifiquei esse código não tem vazamento de memória.
fonte