问题描述
我正在尝试理解独特的指针如何移动语义。现在,我在下面创建了一个虚拟示例来说明问题所在。我的问题是,为什么这段代码会抛出一个未被释放的指针而未分配错误?:
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
编辑(它仅指向某个静态数组),因此可以得到运行时错误。