简介

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. 全自动Landsat影像温度反演软件开发

    许久没有更新遥感类软件开发了,都有点生疏了,这一次我带来了一个老的算法,新的东西, 为什么这么说呢,我们知道Landat8.Landsat5等影像,单个影像去做温度反演,并没有什么太大的难度, 但是呢 ...

  2. C#常用设计模式--单例模式

    为什么要使用单例模式 在我们的整个游戏生命周期当中,有很多对象从始至终有且只有一个.这个唯一的实例只需要生成一次,并且直到游戏结束才需要销毁.  单例模式一般应用于管理器类,或者是一些需要持久化存在的 ...

  3. 如何把设计稿中px值转化为想要的rem值

    首先我们需要的是把尺寸转化为rem值 假如 设计稿中的是 200px*200px的图片 移动端的设计图尺寸一般是640*750; 第一步.  把图片分为若干份(好算即可),每一份的大小就是rem的单位 ...

  4. CSS中属性的详细运用(新手必看)

    =不同的浏览器有不同的默认字体大小font-size 这里以谷歌浏览器为准字体大小为10px   (其他浏览器是12px) 1.这里强调一个备注:属性继承 a 是特殊的,要改变a里面的颜色,必须在它后 ...

  5. meta 详解

    对meta标签用处的介绍,meta常用于定义页面的说明,关键字,最后修改日期,和其它的元数据.这些元数据将服务于浏览器(如何布局或重载页面),搜索引擎和其它网络服务. 组成 meta标签共有两个属性, ...

  6. 找不到’geckodriver’ 的环境path问题“ Message: 'geckodriver' executable needs to be in PATH. ”

    运行测试脚本报找不到’geckodriver’ 的环境path  的错误 selenium3.x webdriver/firefox/webdriver.py的init中,executable_pat ...

  7. CentOS7系统安装

    CenOS7安装系统 镜像下载地址: http://isoredirect.centos.org/centos/7/isos/x86_64/ https://mirrors.aliyun.com/ce ...

  8. Java第四次作业——面向对象高级特性(继承和多态)

    Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...

  9. Bzoj 2318 Spoj4060 game with probability Problem

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 524  Sol ...

  10. Linux文件权限设置教程

    Linux的文件基本权限有9个,分别是owenr.group.others三种身份各自有自己的r.w和x,比如"rwxrwxrwx",就表示owener具有r.w.x权限,同样gr ...