-2

コード:

   #include <iostream>
    using namespace std;

    class Item
    {
        int num;
    public:
        Item(int i) : num(i) {};
        int getNum() const { return num; }
    };

    class ItemPool
    {
    public:
        Item* getItem (int);
    };

    Item* ItemPool::getItem (int n)
    {
        static Item myX(0);
        if (n%2) return &myX;
        else return new Item(n);
    }

    void main()
    {
        ItemPool coll;
        for (int i=0; i<100; i++)
        {
                  Item* anX = coll.getItem(i);
                  cout<<anX->getNum()<<’\n’;
        }
    }

質問:

1)このプログラムの実行におけるセマンティックの問題はどれですか?

2)main()関数のみを変更して、プログラムの動作が同じになるようにしますが、この問題は解消されます。

ありがとう!!

4

1 に答える 1

1

セマンティックの問題は、ItemPool::getItem()メソッドが動的に割り当てられたオブジェクトまたは静的なオブジェクトへのポインターを返す可能性があることです。動的に割り当てられたオブジェクトの所有権を誰が取得するかは明確ではなく、呼び出し元は、の実装の詳細を知らなければ、オブジェクトの割り当てを解除する必要があるかどうかを知る方法がありませんItemPool::getItem()

問題を排除し、プログラムの動作を同じに保つために変更する方法はありません。プログラムの動作に誤りがあるため、問題を修正すると動作が変わります。

の後main()に割り当てを解除Itemsするように変更できます。ただし、メモリリークが発生しなくなるという点で、プログラムの動作が変わります。i%2==0cout

void main()
{
  ItemPool coll;
  for (int i=0; i<100; i++)
  {
    Item* anX = coll.getItem(i);
    std::cout << anX->getNum() << "\n";
    if (i%2) == 0 delete anX;
  }
}
于 2012-09-02T14:33:43.547 に答える