私は構造体の配列を持っています。その配列から要素のリストを削除し、他の要素を左に移動しようとしています。要素をシフトした後、私はもはや必要としない配列の最後にメモリを削除/解放しようとしています。C++:動的構造体配列から要素を削除し、他の要素をシフト
#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 ***
私はこれを引き起こしているのか理解していない私は、次のコードを持っています。多くの人が他のフォーラムで提案しているように、私は '新しい'演算子を使って新しい動的要素を作成しています。
EDIT:
私は、次の変更を加えました:
私はint index = removelist[i]-i
へfor(j=index;j<numofelements-1;j++){
に
int index = removelist[i]
をfor(j=index;j<numofelements-2;j++){
を変更し、私はdelete [] array[j+1]
を削除し、両方のためのループの外delete array[numofelements+1]
を置きます。 私は1つの要素に対してのみ削除を使用しましたが、それは他の冗長要素に対してもメモリを解放しました。これは面白いです。
#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++にはかなりの誤解があるようです。あなたは一歩踏み込んで、良い本から系統的に言語を学ぶべきです。 –
「新」の使用を提案している多くの人々はあなたを好まなかった。 –
漠然としたコメントを投稿するのは何ですか?誰でも私が間違っていることを正確に教えてくれる? – user1763032