{{fbdoc item="title" value="Operator Delete Statement"}}----
Operator to destroy data and free memory allocated with the ##[[KeyPgOpNew|Operator New Expression]]##

{{fbdoc item="usage"}}##
	**Delete** //buf//
		//or//
	**Delete[]** //buf//
##
{{fbdoc item="param"}}
	##//buf//## 
		A pointer to memory that has been allocated by ##[[KeyPgOpNew|New Expression]]## operator or ##**New[] Expression**## operator, the array-version of ##[[KeyPgOpNew|New Expression]]## operator (a typed pointer must be provided in accordance to the data type to delete).

{{fbdoc item="desc"}}
	The ##**Delete Statement**## operator is used to destroy and free the memory of an object created with ##[[KeyPgOpNew|New Expression]]## operator. When deleting a TYPE, its destructor will be called. ##**Delete Statement**## operator should only be used with addresses returned from ##[[KeyPgOpNew|New Expression]]## operator.
	
	The array version of ##**Delete Statement**## operator, ##**Delete[] Statement**## operator, is used to destroy an array of objects previously created with ##**New[] Expression**## operator, the array-version of ##[[KeyPgOpNew|New Expression]]## operator. Destructors will be called here as well.
	
	##**Delete Statement**## operator must be used with addresses returned from ##[[KeyPgOpNew|New Expression]]## operator, and ##**Delete[] Statement**## operator with ##**New[] Expression**## operator, the array-version of ##[[KeyPgOpNew|New Expression]]## operator. You cannot mix and match the different versions of the operators.
	
	After the memory is deleted, the ##//buf//## pointer will be pointing at invalid memory. Calling ##**Delete Expression**## twice on the same pointer value leads to undefined behavior. It may be a good idea to set the //##buf//## pointer to null (##0##), in order to guard against later code using it accidentally, since null pointer dereferences are easier to find and debug.
	
	Calling ##**Delete Statement**## operator on a null pointer induces no action.
	
	The memory deallocation process part provided by the ##**Delete Statement**## operator can be overloaded for user-defined types as a member operator ##[[KeyPgOpDeleteOverload|Delete Overload]]##. The previous process part for data destruction can never be modified.
	
	**Note:** Any operator ##**Delete[]**## (Statement or Overload) and the only Overload operator ##**Delete**## are not compatible with sub-type polymorphism, even using ##[[KeyPgOverride|Override]]## ##[[KeyPgVirtual|Virtual]]## ##[[KeyPgDestructor|Destructor]]## that may in addition induce crashing.
	Instead of having to call such an operator ##**Delete([]) Statement**## on derived-type pointer, the safest way is to simply call (on base-type pointer) an overridden user ##[[KeyPgVirtual|Virtual]]## member procedure that will automatically launch the operator ##**Delete([]) Statement**## at derived-type level.

{{fbdoc item="ex"}}
{{fbdoc item="filename" value="examples/manual/operator/delete.bas"}}%%(freebasic)
type Rational
	as integer numerator, denominator
end type

' Create and initialize a Rational, and store its address.
dim p as Rational ptr = new Rational(3, 4)

print p->numerator & "/" & p->denominator

' Destroy the rational and give its memory back to the system. 
delete p

' Set the pointer to null to guard against future accesses
p = 0
%%

{{fbdoc item="filename" value="examples/manual/operator/delete2.bas"}}%%(freebasic)
' Allocate memory for 100 integers, store the address of the first one.
dim p as integer ptr = new integer[100]

' Assign some values to the integers in the array.
for i as integer = 0 to 99
	p[i] = i
next

' Free the entire integer array.
delete[] p

' Set the pointer to null to guard against future accesses
p = 0
%%
{{fbdoc item="lang"}}
	- Only available in the //[[CompilerOptlang|-lang fb]]// dialect.

{{fbdoc item="diff"}}
	- New to ""FreeBASIC""

{{fbdoc item="see"}}
	- ##[[KeyPgOpNew|New Expression]]##
	- ##[[KeyPgOpDeleteOverload|Delete Overload]]##
	- ##[[KeyPgDeallocate|Deallocate]]##

{{fbdoc item="back" value="CatPgOpMemory|Memory Operators"}}{{fbdoc item="back" value="CatPgOperators|Operators"}}