【发布时间】:2012-06-23 16:06:05
【问题描述】:
我有一个带有静态工厂构造函数的类,它返回一个指向所创建对象的指针。
我必须将对象声明为命名空间内的静态对象,但我不知道如何正确删除它
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 说所有的堆内存都被释放了!
【问题讨论】:
-
你没有在任何地方使用过
new(),为什么你认为你有内存泄漏? -
@Als 我敢打赌
MyFooInitializer有一个新的。 -
@LuchianGrigore:它很可能是一个本地的
static实例,它在整个程序生命周期中始终保持活动状态。如果不是,只需将new替换为一个,然后就不会泄漏:) -
函数中的“g”是什么?为什么要初始化“p”然后删除它?
标签: c++ memory-leaks new-operator static-methods delete-operator