void del 関数は、obj_slot 内のクラス ポインターを NULL に設定できません。
class test_object {
public:
char *name;
int id;
};
int current_amount;
test_object *obj_slot[512];
void add(test_object *obj)
{
if(current_amount < 512)
{
obj->id = current_amount;
obj_slot[current_amount] = obj;
current_amount ++;
}
else {
std::cout<<"max exceeded";
}
}
void printList(char *status){
printf("%s\n",status);
for(int i = 0 ; i < current_amount ; i ++)
{
printf("list object id %i; string is %s,pointer:%p\n",obj_slot[i]->id,obj_slot[i]->name,obj_slot[i]);
}
}
void del(test_object *obj)
{
printList("before:");
if(!obj)
return;
printf("deleting %s id %i,pointer %p\n",obj->name,obj->id,obj);
for(int i = obj->id ; i < current_amount - 1 ; i ++)
{
obj_slot[i] = obj_slot[i + 1];
}
delete obj;
obj = NULL;
current_amount--;
printList("after:");
}
//これはテストプログラムです:
int main(int argc, char **argv) {
std::cout << "Hello, world!" << std::endl;
for(int i = 0 ; i < 5; i ++)
{
test_object *test = new test_object();
char a[500];
sprintf(a,"random_test_%i",i);
test->name = (char *)malloc(strlen(a) + 1);
strcpy(test->name,a);
add(test);
}
test_object *test = new test_object();
test->name = "random_test";
add(test);
del(test);
printf("test pointer after delete is %p\n",test);
return 0;
}
del 関数で削除するポインター アドレスを NULL に設定しました。しかし、コンソール出力はまだこれです:
前: リスト オブジェクト ID 0; 文字列はrandom_test_0、ポインタ:0x706010
リスト オブジェクト ID 1; 文字列はrandom_test_1、ポインタ:0x706050
リスト オブジェクト ID 2; 文字列はrandom_test_2、ポインタ:0x706090
リスト オブジェクト ID 3; 文字列はrandom_test_3、ポインタ:0x7060d0
リスト オブジェクト ID 4; 文字列はrandom_test_4、ポインタ:0x706110
リスト オブジェクト ID 5; 文字列は random_test,pointer:0x706150 です
random_test ID 5、ポインター 0x706150 を削除しています
後: リスト オブジェクト ID 0; 文字列はrandom_test_0、ポインタ:0x706010
リスト オブジェクト ID 1; 文字列はrandom_test_1、ポインタ:0x706050
リスト オブジェクト ID 2; 文字列はrandom_test_2、ポインタ:0x706090
リスト オブジェクト ID 3; 文字列はrandom_test_3、ポインタ:0x7060d0
リスト オブジェクト ID 4; 文字列はrandom_test_4、ポインタ:0x706110
削除後のテスト ポインタは 0x706150 です
※正常終了※