类方法与static和const的交互

时间:2012-09-02 14:30:37

标签: c++ oop class methods

代码:

   #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()函数,以便程序的行为保持不变,但是消除了这个问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

语义问题是ItemPool::getItem()方法可以返回指向动态分配对象或静态对象的指针。目前尚不清楚谁拥有动态分配的对象的所有权,并且调用者无法知道他们是否必须解除对象的释放,而不知道ItemPool::getItem()的实现细节。

我认为无法改变消除问题保持程序行为相同。程序行为是错误的,因此修复问题会改变其行为。

您可以修改main()以在Items之后的i%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;
  }
}