在我的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[])
{
}
答案 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; }