gpt4 book ai didi

c++ - 是否需要删除存储为静态局部变量的数组,如何删除?

转载 作者:行者123 更新时间:2023-11-30 01:31:04 26 4
gpt4 key购买 nike

我有几个数组和一个资源需要删除,这些变量的值在程序的整个生命周期中都会保留,并且它们仅在单个函数中使用,因此它自然适合静态变量:

void func() {
static GLfloat arrs[4] = {1, 1, 1, 1};
static GLUquadric* quad = gluNewQuadric(); // delete with gluDeleteQuadric(quad)
//... other codes ...
}

但是,如果我使用 static,我将无法删除这些资源,因为我无法从函数外部访问这些变量。我可以制作这些全局变量,但我想尽可能避免这种情况。

那么问题是:

  1. arrs[] 是堆栈分配的还是堆分配的?那么,我需要删除它吗?
  2. 对于 GLUquadric,显然编译器不知道如何正确删除它,现在我使用了 RAII。包装类,效果很好,但我正在寻找是否有更简单的方法。

valgrind 提示没有释放 GLUquadric,我想我只是清理它而不是让 valgrind 静音,即使程序应该在我释放它们时无论如何都要结束并且这些资源可能(?)在什么时候释放程序结束。

最佳答案

  1. 不需要删除arrs[],它没有分配在堆上。它也不在堆栈上,它在某处的数据段中,并且是静态程序数据的一部分,并且会在进程执行时消失。

  2. 关于堆但一般不用担心。这种在静态初始化期间分配堆的方法不是很好,但它只会在您最后需要任何析构函数调用(以摆脱外部资源等)时字节给您。

已编辑:我仍然担心那个堆对象。特别是如果它来自某个图书馆;你永远不知道它在内部做什么,它可能锁定了一些硬件资源或类似资源。你不能在这里用智能指针等做任何事情,但如果你真的需要以这种方式分配它,那么使用 atexit() 函数或类似函数注册释放可能是值得的。或者把整个东西放到一个带有析构函数的全局静态单例对象中。如果您知道该对象只包含数据,您就什么都不用担心,也就是说,不用担心您的堆。

关于c++ - 是否需要删除存储为静态局部变量的数组,如何删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com