简介

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];

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

删除数组

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

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

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

删除时gas的处理

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

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

注意事项

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

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

原文链接:http://www.choupangxia.com/2019/07/29/solidity的delete操作汇总/

solidity的delete操作汇总的更多相关文章

  1. Solidity的delete操作

    Solidity中有个特殊的操作符delete用于释放空间,因为区块链技术做为一种公用资源,为避免大家滥用.且鼓励主动对空间的回收,释放空间将会返还一些gas. delete关键字的作用是对某个类型值 ...

  2. Oracle知识梳理(三)操作篇:SQL基础操作汇总

    Oracle知识梳理(三)操作篇:SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式:       CREATE TABLE  table_name ( col_ ...

  3. SQL基础操作汇总

    SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式:    CREATE TABLE  table_name ( col_name    datatype, -- ...

  4. 关于JavaScript中的delete操作

    关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...

  5. 表上的DELETE操作

    在今天的文章里,我想给你快速展示下当我们从表里删除记录时,在SQL Server里发生了什么.首先我们来创建一个简单的表,在8KB的页上刚好能插入4条记录. -- Create a simple ta ...

  6. mysql没有delete操作,那是delete from操作,

    1.mysql没有delete操作,那是delete from操作, 2.DELETE FROM table_name [WHERE Clause]

  7. PHP数组操作汇总

    php 操作数组 (合并,拆分,追加,查找,删除等) - Just Code - ITeye技术网站 PHP操作数组的一些函数介绍 -- 简明现代魔法 PHP数组元素操作实例 -- 简明现代魔法 儿童 ...

  8. 提升效率的Linux终端快捷操作汇总

    很多普通 Linux 桌面用户都对使用终端感到排斥和恐惧,其实它没大家想的那么复杂,很多常见操作都可以直接在终端中进行,如:安装软件.升级系统等. 无论你是新手还是 Linux 终端使用的老鸟,系统极 ...

  9. SVN中正确的add操作和delete操作

    add操作: delete操作:

随机推荐

  1. mpvue 小程序加载不了图片 Error: Failed to load local image resource /images/xx.png the server responded with a status of 404 (HTTP/1.1 404 Not Found)

    mpvue开发小程序时候,要添加静态本地图片 <img src="../../images/bg.png" alt=""> 会报错: VM14878 ...

  2. Java中初始化的相关问题

    目录 局部变量的初始化 成员变量的初始化 构造器初始化 静态数据的初始化 总结 已经快半个月没写博客了,这周在看 Thinking in Java 这本书,准备将书中的第五章和第七章的内容整合一下,写 ...

  3. 18 HTML标签以及属性全

    基本结构标签: <HTML>,表示该文件为HTML文件 <HEAD>,包含文件的标题,使用的脚本,样式定义等 <TITLE>---</TITLE>,包含 ...

  4. PWN 菜鸡入门之 shellcode编写 及exploid-db用法示例

    下面我将参考其他资料来一步步示范shellcode的几种编写方式 0x01 系统调用 通过系统调用execve函数返回shell C语言实现: #include<unistd.h> #in ...

  5. .NET CORE与Spring Boot编写控制台程序应有的优雅姿势

    本文分别说明.NET CORE与Spring Boot 编写控制台程序应有的“正确”方法,以便.NET程序员.JAVA程序员可以相互学习与加深了解,注意本文只介绍用法,不会刻意强调哪种语言或哪种框架写 ...

  6. oracle 向数据库同时插入多条数据

    oracle 与 mysql 不同. mysql 可以直接插入多条数据的操作:  采用 INSERT INTO 某表 VALUES(各个值),VALUES(各个值),.....; 或者 INSERT ...

  7. Fabric1.4源码解析:链码实例化过程

    之前说完了链码的安装过程,接下来说一下链码的实例化过程好了,再然后是链码的调用过程.其实这几个过程内容已经很相似了,都是涉及到Proposal,不过整体流程还是要说一下的. 同样,切入点仍然是fabr ...

  8. HDU 3338:Kakuro Extension(脑洞大开的网络流)

    http://acm.hdu.edu.cn/showproblem.php?pid=3338 题意:在一个n*m的地图里面,有黑方块和白方块,黑方块可能是“XXXXXXX”或者“YYY/YYY”,这里 ...

  9. Azkaban Flow 2.0 使用简介

    官方建议使用Flow 2.0来创建Azkaban工作流,且Flow 1.0将被弃用 目录 目录 一.简单的Flow 1. 新建 flow20.project 文件 2. 新建 .flow 文件 3. ...

  10. 如何编写无须人工干预的shell脚本

    在使用基本的一些shell命令时,机器需要与人进行互动来确定命令的执行.比如 cp test.txt boo/test.txt,会询问是否覆盖?ssh远程登陆时,需要输入人工密码后,才可以继续执行ss ...