繁体   English   中英

我应该在C ++中删除静态对象吗

[英]should I delete static object in c++

在我的主要功能之前,我声明了一个静态指针数组,其中包含指向实现基本数组类的对象的新指针,并且我想知道是否应该使用“删除”自己删除它(或仅删除类)。

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[])
{
}

您需要在程序结束之前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

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

自动化清理:

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(), ... };

您还应该努力避免任何全局对象! 他们开始将自己的生活作为遗产,并且发展很快。

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

是的你应该。 您应该始终释放分配的所有内存。

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

创建代码时请考虑未来。 也许您的代码将在将来成为某种插件,并且如果您随后还无法释放static内存,则将导致内存泄漏。 另外,如果您以后决定删除static关键字。

创建完资源后,应将其删除。 如果您只是终止程序,则没有必要,因为系统会为您执行该程序,但是为适当起见,您创建的任何资源都应在终止前销毁。 除了适当之外,如果您发现有必要使用诸如Valgrind之类的工具来跟踪该问题以帮助您发现泄漏,那么这会使您更轻松。

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

否则,您应该删除它们。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM