delete之后千万要记得将指针置空,即勿重复delete!!!

下面这段代码有什么问题吗?(Arduino上运行)

class C{
public:
    C(){
        ptr = new int[12];
    }
    ~C(){
        if(ptr!=NULL)delete [] ptr;
    }
    void reset(){
        if(ptr!=NULL)delete [] ptr;
    }
private:
    int *ptr;
};
void f2(){
    C c;
    c.reset();
}
void f(){
    f2();
    int *arr1 = new int[5];
    int *arr2 = new int[5];
    //操纵arr1,arr2
}

事实上,如果我们输出指针arr1,arr2的值,就会发现内存根本就是乱分配的,改变参数后甚至有可能出现arr1与arr2指向的内存范围重合的情况。

那么是什么原因造成的呢?由于ptr在reset中delete后没有置为NULL ,导致了在析构中第二次delete。这么改就可以了:

void reset(){
    if(ptr!=NULL){
        delete [] ptr;
        ptr = NULL;
    }
}

教训:

1.delete之后一定马上及时置NULL

2.千万不能重复delete东西

时间: 2024-08-10 23:52:06

delete之后千万要记得将指针置空,即勿重复delete!!!的相关文章

对指针调用delete之后要记得把指针赋值为nullptr

否则,如果这个指针被重复delete,会死机. #include <iostream> using std::cout; using std::endl; using std::ostream; class Tree {   int height; public:   Tree(int treeHeight) : height(treeHeight) {     cout << __func__ << "(), this = " << t

如何让file input能够实现置空和【异步】上传后相同文件的再次选择触发change

file input出于安全角度,是不允许赋值的,即使是置空,虽然通过给innerHtml赋值可以清空,但貌似仅在ie下起使用. 因为缺少置空的方法,用户异步上传完毕文件后选择相同文件时,不会触发change,因为在这种情况下,我们没有办法使value(也就是文件路径)发生变化. 那难道就无解了么..当然不是.. 我的解决方法是,每次选完文件,就重建此元素,这样值自然是空的,因为clone不带值,这样就是一个全新的file input,每一次选择,自然各种正常.以下是关键代码: <label i

指向对象的引用置空---与内存泄漏

import java.util.Arrays; public class Stack { private static final int INIT_SIZE = 10; private Object[] datas; private int size; public Stack() { super(); datas = new Object[INIT_SIZE]; } public void push(Object data){ if (size == datas.length) { ext

DateTimePicker 控件置空

dtOrderDateFrom.Format = DateTimePickerFormat.Custom; dtOrderDateFrom.CustomFormat = " "; DateTimePicker 时间控件置空

Unity中为UGUI中的Image置空

首先需要一开始获取一张空的图片,然后进行记录,当想要给一个Image中的图片置空是时候就可以将其中的值置为其: public class ImageChange : MonoBehaviour { //获取的是原来的空图片 private Sprite FormatSprite; public Sprite ChangeSprite; private void Start() { FormatSprite = transform.GetComponent<Image>().sprite; }

【js】数组置空的其他方式及使用场景

数组在js中属于引用型类型. var arr = [1, 2, 3]; a = []; 通常使用以上方式.如果使用场景必须使用方法置空, 可以采用arr.length = 0; 或者使用a.splice(0, a.length); 使用场景 vue2中组定义组件中v-model的值是数组类型, 组件内部需要清空时, 采用第一种方无法实现双向绑定. 原文地址:https://www.cnblogs.com/daaasheng/p/9976080.html

Oracle库Delete删除千万以上普通堆表数据的方法

需求:Oracle数据库delete删除普通堆表千万条历史记录. 直接删除的影响: 1.可能由于undo表空间不足从而导致最终删除失败的问题: 2.可能导致undo表空间过度使用,影响到其他用户正常操作. 改进方案:每删除1k行就提交一次.(这样就把一个大事物拆分成了若干个小事物) 注意:下面方法以删除2014年之前的所有记录为例,请根据你的实际情况修改,防止误操作. 方法1 declare cursor [del_cursor] is select a.*, a.rowid row_id fr

mybatis内置insert、update和delete

前面已经说过了怎么获取Connection,这次看下内置的insert和update是怎么实现的. insert和update最后都会调用update(String statement, Object parameter)方法,如图1: 图1 Executor在DefaultSqlSession生成中已经说明过,默认生成的是CachingExecutor,在CachingExecutor中有个代理,如果不指定默认就是SimpleExecutor,如图2: 图2 那么就直接看下executor.u

C++ delete掉的是new出的堆区内存,无法delete掉栈区的内存

直接上代码感受一下: #include <iostream>using namespace std; int main(){ int a=3; int* p1=&a; int* p2=new int(8); cout<<a<<' '<<*p1<<' '<<p1<<' '<<*p2<<' '<<p2<<endl; delete p1; delete p2; cout&l