solidity的delete操作汇总

简介: solidity的delete操作汇总

简介

Solidity中的特殊操作符delete用于释放空间,为鼓励主动对空间的回收,释放空间将会返还一些gas。


delete操作符可以用于任何变量,将其设置成默认值0。


删除枚举类型时,会将其值重置为序号为0的值。


如果对动态数组使用delete,则删除所有元素,其长度变为0。


如果对静态数组使用delete,则重置所有索引。


如果对map类型使用delete,什么都不会发生。


如果对map类型中的一个键使用delete,则会删除与该键相关的值。


删除基本类型

使用delete删除基本类型会设置为对应的初始值。


pragma solidity ^0.5.10;
contract DeleteDemo{
    bool public b  = true;
    uint public i = 1; 
    address public addr = msg.sender;
    bytes public varByte = "123";
    string  public str = "abc";
    enum Color{RED,GREEN,YELLOW}
    Color public color = Color.GREEN;
    function deleteAttr() public {
        delete b; // false
        delete i; // 0
        delete addr; // 0x0
        delete varByte; // 0x
        delete str; // ""
        delete color;//Color.RED
    }
}

删除结构体

删除结构体,会将所有成员变量置为初值。

struct Person{
    string name;
    uint age;
}
Person public p = Person("zhangsan",21);
function deletePerson() public{
    delete p;
}

调用改方法之后,结构体Person的name将变为空,age将变为0。


删除mapping

映射是一个特殊的存在,由于映射的键并不总是能有效遍历,所以不能直接删除一个映射。如果直接删除一个映射会报错Unary operator delete cannot be applied。但可以指定键来删除映射中的某一项。


mapping[msg.sender] = 1;

//可以按key删除映射

delete mapping[msg.sender];

1

2

3

如果删除一个结构体时,其中含有映射类型,会跳过映射类型。也就是说,结构体的其他内容会被初始化,而其中mapping中的内容不会改变。


删除数组

对于定长数组,删除时,是将数组内所有元素置为初值。


对于变长数组时,则是将长度置为0。


可以删除数组的一个元素,删除一个元素后,数组中对应位置的值会被初始值,其它值不受影响。


删除时gas的处理

删除时忽略映射和删除数组中某个位置的值仅初始化改值而不重组数组都是考虑到节省gas。如果映射或数组非常大的情况下,删除或维护它们将变得非常消耗gas。


清理空间的额外好处是可以获得gas返还,但对无特别意义的数组的整理和删除,只会消耗更多gas,需要在业务实现上进行权衡。


注意事项

删除的本质是初始化变量。所以删除storage的引用时会报错,因为storage的引用并没有自己已分配的存储空间,所以不能对storage的引用直接赋初值。


但可对其引用的对象进行delete操作。


目录
相关文章
|
5月前
|
Go 开发者
Go1.22 新特性:Slices 变更 Concat、Delete、Insert 等函数,对开发挺有帮助!
Go1.22 新特性:Slices 变更 Concat、Delete、Insert 等函数,对开发挺有帮助!
|
7月前
|
SQL 数据库
`UPDATE FROM` 的语法以及常见的更新操作方式
`UPDATE FROM` 的语法以及常见的更新操作方式
1248 2
|
6月前
|
C++
C++基础知识(二:引用和new delete)
引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。
|
8月前
|
安全 程序员 C++
C++ new和delete的用法
需要注意的是,使用 `new`和 `delete`分配和释放内存时,程序员负责管理内存的分配和释放,这可能导致内存泄漏或释放已释放内存的问题。因此,C++引入了智能指针(如 `std::shared_ptr`和 `std::unique_ptr`)以更安全和自动化地管理内存。
121 2
|
7月前
|
关系型数据库 MySQL 数据库
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
164 0
|
SQL 关系型数据库 测试技术
软件测试|教你如何使用UPDATE修改数据
软件测试|教你如何使用UPDATE修改数据
|
程序员 C++
C++:new和delete的用法
C++:new和delete的用法
101 0
|
消息中间件 JavaScript 小程序
一个update语句执行要10s,大厂的架构真垃圾!
一个update语句执行要10s,大厂的架构真垃圾!
|
Python
Python:orator/backpack内置数据操作类Collection
Python:orator/backpack内置数据操作类Collection
130 0
|
SQL 存储 缓存
执行update语句,用没用到索引,区别大吗?
我们都知道,当执行 select 查询语句时,用没用到索引区别是很大的,若没用到索引,一条 select 语句可能执行好几秒或更久,若使用到索引则可能瞬间完成。那么当执行 update 语句时,用没用到索引有什么区别呢,执行时间相差大吗?本篇文章我们一起来探究下。
430 0