【发布时间】:2018-06-10 21:35:16
【问题描述】:
我有一个结构数组。我正在尝试从该数组中删除元素列表并将其他元素向左移动。移动元素后,我试图删除/释放我们不再需要的数组末尾的内存。我有以下代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
void removeelement(int*);
void displayelements();
typedef struct {
int n;
}element;
element** array;
int numofelements=5;
int main() {
array = (element**)malloc(5*sizeof(element*));
for(int i=0;i<5;i++){
array[i] = new element;
array[i]->n=i;
}
int removelist[3] = {1,3,4};
removeelement(removelist);
displayelements();
return 0;
}
void removeelement(int* removelist){
for(int i=0;i<3;i++){
int index = removelist[i];
int j;
for(j=index;j<numofelements-2;j++){
array[j] = array[j+1];
}
delete [] array[j+1];
numofelements--;
}
}
void displayelements(){
int i=0;
while(i<numofelements){
printf("%d\n",array[i]->n);
i++;
}
}
但是delete [] array[j+1]; 导致异常:
*** Error in `main': double free or corruption (fasttop): 0x0000000001861cb0 ***
我不明白是什么原因造成的。正如许多人在其他论坛中所建议的那样,我正在使用“new”运算符来创建一个新的动态元素。
编辑:
我做了以下更改:
我把for(j=index;j<numofelements-2;j++){改成了for(j=index;j<numofelements-1;j++){
int index = removelist[i] 到 int index = removelist[i]-i
我删除了 delete [] array[j+1] 将 delete array[numofelements+1] 放在两个 for 循环之外。
虽然我只在一个元素上使用了 delete,但它也为其他冗余元素释放了内存,这很有趣。
这是最终代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
void removeelement(int*);
void displayelements();
typedef struct {
int n;
}element;
element** array;
int numofelements=5;
int main() {
array = (element**)malloc(5*sizeof(element*));
for(int i=0;i<5;i++){
array[i] = new element;
array[i]->n=i;
}
int removelist[3] = {1,3,4};
removeelement(removelist);
displayelements();
return 0;
}
void removeelement(int* removelist){
for(int i=0;i<3;i++){
int index = removelist[i]-i;
int j=index;
for(;j<numofelements-1;j++){
array[j] = array[j+1];
}
numofelements--;
}
delete array[numofelements+1];
}
void displayelements(){
int i=0;
while(i<5){
printf("%d\n",array[i]->n);
i++;
}
}
我使用此代码使其工作。但我将按照你们许多人的建议使用 std::vector。
【问题讨论】:
-
你似乎对C++有不少误解。你应该退后一步,从一本好书中系统地学习语言。
-
那些建议使用
new的人不喜欢你。 -
张贴模糊的cmets有什么用?谁能确切地告诉我我做错了什么?
-
主要是
delete[]暗示new[],而不是new。但请改用std::vector。new不应该使用,尤其是初学者。 -
您真正应该做的是标记要删除的元素,然后删除标记的元素。您不应该在删除每个数组的同时移动数组,因为这会使
removelist条目不再指向每次迭代的有效条目。是的,您的很多代码都可以使用vector,但主要问题是您的删除逻辑,无论您使用的是new还是vector。
标签: c++ malloc free delete-operator