我有一個類具有靜態工廠構造函數返回一個指向創建的對象。靜態工廠方法和靜態對象的內存泄漏
我必須聲明的對象作爲命名空間中的靜態對象,但我不知道如何刪除它正確
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被聲明爲靜態的,因爲一旦創建了所有的程序中,它必須是同一個對象,並且必須是唯一的(它會跟蹤一些變量)。
也許這是一個設計問題,但我不知道如何在我的程序退出或當我明確地想刪除它重新初始化它刪除。
SOLUTION:
我修改的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:它很可能是一個本地'靜態'實例,它在整個程序生命週期中始終保持活動狀態。如果不是,只需將'new'替換爲一個,然後就沒有泄漏:) –