-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()Itemsi%2==0. cout但这会改变程序的行为,因为不再有内存泄漏。

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 回答