我应该删除c ++中的静态对象

时间:2013-12-28 12:46:03

标签: c++

在我的main函数之前,我声明了一个静态指针数组,其中包含指向实现基类数组的对象的新指针,我想知道是否应该使用“delete”删除它(或者只是类)。

static AStudentList* a = new AStudentList();
static BStudentList* b = new BStudentList();
static CStudentList* c = new CStudentList();
static DStudentList* d = new DStudentList();
static InstitutionStudentList* instArr[4] = {a, b, c, d};

int main(int argc, char *argv[])
{
}

7 个答案:

答案 0 :(得分:4)

在程序结束之前,您需要delete四个对象中的每一个,如下所示:

delete instArr[0];
delete instArr[1];
delete instArr[2];
delete instArr[3];

你不应该delete数组,因为它没有动态分配。

但是,我没有理由在这里使用动态分配的对象。为什么不这样做:

static AStudentList a;
static BStudentList b;
static CStudentList c;
static DStudentList d;
static InstitutionStudentList* instArr[4] = {&a, &b, &c, &d};

然后你没有delete

答案 1 :(得分:3)

一个简单的经验法则是,每次new次调用都应该只有一次delete次呼叫。所以在这种情况下你需要删除4次 - 存储在数组instArr中的4个指针,但你不应该删除数组本身。

答案 2 :(得分:2)

自动清理:

static AStudentList a;
static BStudentList b;
static CStudentList c;
static DStudentList d;
static InstituationStudentList* instArray[] = { &a, &b, &c, &d };

除非有很强的理由在堆上分配对象,否则不要这样做。如果你真的绝对要我们堆分配对象,请使用

static std::unique_ptr<AStudentList> a(new AStudentList);
...
static InstituationStudentList* instArray[] = { a.get(), ... };

您还应该努力避免任何全局对象!他们开始他们的生活是一种遗产,而且只是快速增长。

答案 3 :(得分:1)

是的,因为它已使用operator new在堆上分配。仅仅因为你将变量声明为静态,并不意味着变量是在堆栈上创建的,内存将自动释放。

答案 4 :(得分:0)

是的,你应该。您应该始终释放您分配的任何内存。

话虽如此,您可能会在致电exit()或以其他方式结束您的计划之前将其释放。然后,操作系统的内核将自动释放内存。最终结果基本相同。

在创建代码时考虑未来。也许你的代码将来会成为某种插件,如果你不能释放static内存,你就会引入内存泄漏。此外,如果您以后决定删除static关键字。

答案 5 :(得分:0)

完成您创建的资源后,应删除它们。如果您只是终止程序,则没有必要,因为系统会为您执行此操作,但在正确的情况下,您创建的任何资源都应在终止之前被您销毁。除了正确之外,如果您发现有必要使用像Valgrind这样的工具来帮助您找到泄漏,这会让您更轻松。

答案 6 :(得分:0)

如果您不需要删除它们,因为它们的生命周期是整个程序而您永远不需要用新对象替换它们,那么将它们存储到堆中是没有意义的。

否则你应该删除它们。

即使您将指针直接存储在数据段中,也始终可以使用指针:

static AStudentList a;
static const AStudentList* aPtr() { return &a; }