-3

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 です

※正常終了※

4

1 に答える 1

3

これは、del関数内では変数objローカル変数であり、それに対するすべての変更はその関数の外では見えないためです。変更したい場合は、代わりに参照として渡す必要があります。

void del(test_object *&obj)
{
    ...
}
于 2012-11-04T12:10:38.280 に答える