> ## Documentation Index
> Fetch the complete documentation index at: https://docs.starknet.io/llms.txt
> Use this file to discover all available pages before exploring further.

# core::traits::Destruct

A trait that allows for custom destruction behavior of a type.
In Cairo, values must be explicitly handled - they cannot be silently dropped.
Types can only go out of scope in two ways:

1. Implement `Drop` - for types that can be discarded trivially
2. Implement `Destruct` - for types that need cleanup when destroyed. Typically, any type that
   contains
   a `Felt252Dict` must implement `Destruct`, as the `Felt252Dict` needs to be "squashed" when
   going
   out of scope to ensure a program is sound.

Generally, `Destruct` does not need to be implemented manually. It can be derived from the
`Drop` and `Destruct` implementations of the type's fields.

## Signature

```rust theme={null}
pub trait Destruct
```

## Examples

Here's a simple type that wraps a `Felt252Dict` and needs to be destructed:

```rust theme={null}
use core::dict::Felt252Dict;

// A struct containing a Felt252Dict must implement Destruct
#[derive(Destruct, Default)]
struct ResourceManager {
    resources: Felt252Dict,
    count: u32,
}

#[generate_trait]
impl ResourceManagerImpl of ResourceManagerTrait{
   fn add_resource(ref self: ResourceManager, resource_id: felt252, amount: u32){
       assert!(self.resources.get(resource_id) == 0, "Resource already exists");
       self.resources.insert(resource_id, amount);
       self.count += amount;
   }
}

let mut manager = Default::default();

// Add some resources
manager.add_resource(1, 100);

// When manager goes out of scope here, Destruct is automatically called,
// which ensures the dictionary is properly squashed
```

## Trait functions

### destruct

#### Signature

```rust theme={null}
fn destruct(self: T)
```
