具有唯一指针的右值和移动语义:对象0x7ffee5c7b670的错误:未分配正在释放的指针

问题描述

我正在尝试理解独特的指针如何移动语义。现在,我在下面创建了一个虚拟示例来说明问题所在。我的问题是,为什么这段代码会抛出一个未被释放的指针而未分配错误?:

 generateUserCSV() {
    this.emailService.getAllEmail().subscribe((res) => { this.downloadFile(res,'emails') })
  }


  downloadFile(data,filename = 'data') {
    let csvData = this.ConvertToCSV(data,['email','firstname','lastname']);
    console.log(csvData)
    let blob = new Blob(['\ufeff' + csvData],{ type: 'text/csv;charset=utf-8;' });
    let dwldLink = document.createElement("a");
    let url = URL.createObjectURL(blob);
    let isSafaribrowser = navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1;
    if (isSafaribrowser) {  //if Safari open in new window to save file with random filename.
      dwldLink.setAttribute("target","_blank");
    }
    dwldLink.setAttribute("href",url);
    dwldLink.setAttribute("download",filename + ".csv");
    dwldLink.style.visibility = "hidden";
    document.body.appendChild(dwldLink);
    dwldLink.click();
    document.body.removeChild(dwldLink);
  }

  ConvertToCSV(objArray,headerList) {
    let array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    let str = '';
    let row = 'Index,';

    for (let index in headerList) {
      row += headerList[index] + ',';
    }
    row = row.slice(0,-1);
    str += row + '\r\n';
    for (let i = 0; i < array.length; i++) {
      let line = (i + 1) + '';
      for (let index in headerList) {
        let head = headerList[index];

        line += ',' + array[i][head];
      }
      str += line + '\r\n';
    }
    return str;
  }

解决方法

这与std::unique_ptr无关。之所以出现“未分配指针未分配”错误,是因为显示的代码试图delete而不是newed

    delete[] this->values;
    values = new_values;

这正确地delete替代了旧的values,但随后盲目地将values设置为指向从未new编辑过的内容(不会new_values被传递到这里)。

因此,此对象的析构函数随后尝试new进行delete中的操作,但是从未对其进行values编辑(它仅指向某个静态数组),因此可以得到运行时错误。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...