代码:
#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()函数,以便程序的行为保持不变,但是消除了这个问题。
谢谢!
答案 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;
}
}