【问题标题】:How do I delete variables from the heap?如何从堆中删除变量?
【发布时间】:2013-01-04 11:41:12
【问题描述】:

我一直在做一些研究,但仍然找不到解决问题的方法。 据我所知,当我们在函数之外声明变量时,它们是在堆内分配的,并且直到执行结束才释放内存;除非我们专门使用 delete 函数这样做。我尝试了以下函数来释放代码开头声明的变量,但它们都不起作用(在 dbgdel.cpp 中出现调试错误):deletedelete []free()。 我做错了什么?

我将在代码的摘要版本下面粘贴。任何帮助表示赞赏。谢谢!

(我知道在正确的编程中通常不需要全局变量,但这不是我的代码,我只是想按原样修复它。)

#include <stdio.h>
#include <conio.h>
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include "Viewer.h"
....    
// Arrays
float z_base [5201][5201];
....

uchar maskThreshold [5200][5200];
...


void main(){
.....       
     delete [] z_base;
     //free (z_base);
     //delete z_base;
     //free (&z_base);    
} 

【问题讨论】:

  • 变量并不存在于“堆上”。只有 objects 可以。
  • @KerrekSB:一些变量是对象(具体来说,不是引用的变量是对象)。所以“只有对象”可能不是表达这一点的正确方式。
  • 实际上,如果我们可以确定将 int i = 0; 之类的声明中定义的对象称为“变量”是不正确的,我会收回这一点。有人可能会争辩说,“变量”不是对象本身,而是一个有名称的编译时实体,其名称指的是一个对象。
  • @SteveJessop:我认为你把猫和人弄错了。变量可以是对象。但是动态分配的对象永远不能是变量,变量永远不能是动态对象。 (我对此进行了详细说明in this answer。)
  • @KerrekSB:这就是我的想法,“变量”这个词确实正确地指代了对象。没什么大不了的,但是当一些 Z 实际上是 Xs 时,说“X 不是 Y,只有 Z 是”就不太有意义了。

标签: c++ visual-c++ heap-memory free


【解决方案1】:

据我所知,当我在每个函数之外声明变量时,它们都分配在堆中

这不是真的。一般情况下,如果您分别使用newnew [] 分配了内存,则只需调用deletedelete[]

【讨论】:

    【解决方案2】:
    1. 没有堆(在 C++ 中)。
    2. 所有内存在执行结束时被释放。
    3. delete你什么newdelete[]你什么new[]
    4. void main 错误(main 必须返回 int)。

    仅此而已。

    【讨论】:

    • @mah 由operator new 决定。
    • 我们不必专门讨论通用系统,当我们谈论在它们上运行的语言时。我是说 C++ 分配给堆,虽然当你将堆与语言分离时你在技术上是正确的,但当你认为它不存在时,你正在玩文字游戏——尤其是当你不存在的时候建议一个现实的替代方案,你不觉得吗?
    • @mah 我不同意。理解 C++ 中正确的内存管理不需要特定实现的晦涩细节。
    • @melpomene 它确实需要了解堆栈的原理,因为这是需求的基本部分,即使没有使用名称。 (“堆”有点含糊,因为它可以指代几种不同的东西;除非是指真正的堆数据结构,否则应该避免使用这个词,如std::push_heap 等。)
    • 既然我们在玩:如果堆的存在是与 C++ 标准无关的特定实现细节,那么在程序执行结束时释放所有内存的事实也是如此。操作系统在进程终止时所做的事情(或硬件/引导加载程序/在程序终止时为无操作系统实现所做的事情)超出了标准的范围。
    【解决方案3】:

    你没有。运行时将为您完成。根据经验,你只需要delete/delete[] 分配给new/new[] 的那个。

    另外,请注意全局变量不是在堆上分配的,而是在静态内存中。

    【讨论】:

    • 我知道你所说的静态是什么意思。但是这个词太重了,对于新手和初学者来说,值得更明确一点。
    猜你喜欢
    • 2015-05-14
    • 2022-06-28
    • 2017-09-15
    • 1970-01-01
    • 2018-08-29
    • 2012-12-07
    • 1970-01-01
    • 2020-07-11
    • 2011-11-09
    相关资源
    最近更新 更多