我有一个带有静态工厂构造函数的类,它返回一个指向所创建对象的指针。
我必须将对象声明为命名空间内的静态对象,但我不知道如何正确删除它
class Foo
{
public:
Foo(int, int* );
virtual ~Foo();
static Foo* MyFooInitializer(int n )
{
int *p = new int[n];
for (int i=0; i<n; i++)
p[i]=i;
Foo *ret = new Foo(n,p);
delete p;
return ret;
}
int someFooFunction(int a);
}
然后在我的命名空间中我有一个static inline
函数
namespace MyNamespace
{
static inline void myfunction()
{
static Foo *foo1 = Foo::MyFooInitializer(10);
int y = somevalue();
int x = foo1->someFooFunction(int y);
}
}
我显然在这里有内存泄漏,因为该对象永远不会被删除。
重要的事实是我需要将 foo1 声明为静态的,因为一旦创建,它在所有程序中必须是同一个对象并且必须是唯一的(它跟踪一些变量)。
可能这是一个设计问题,但是当我的程序退出或当我明确想要删除它以重新初始化它时,我不知道如何删除它。
解决方案:
我这样修改了正文MyFooInitializer
:
static Foo* MyFooInitializer(int n )
{
int *p = new int[n];
for (int i=0; i<n; i++)
p[i]=i;
static Foo ret = Foo(n,p);
delete[] p;
return &ret;
}
这允许我在程序终止时正确释放所有内存。Valgrind 说所有的堆内存都被释放了!