如何删除C++中的变量
How can I delete variables in C++
我想在我的程序中释放ram。
尽管我是个新手,但我真的很在乎表现。
string i_want_to_delete_this = "I don't want this cleared, but
completely gone";
/* I figured out */ i_want_to_delete_this.clear() /* simply sets the
string value to "". I want to be able to do this with every
datatype! I want it completely gone, not even declared anymore. */
我不明白你为什么要这样做,在任何情况下,你都不能删除或以其他方式删除命名变量,除非当它们超出范围时,编译器会从概念上为你删除它们,而当包含它们的函数退出时,实际上会删除它们。例如:
{
{
string i_want_to_delete_this = "I don't want this cleared, but
completely gone";
} // it's gone
}
有三种类型的变量。根据你对记忆的管理方式不同。
全局变量
这些位于程序的一个特殊部分。它们在程序启动时出现,在程序结束时消失。您不能做任何事情来回收全局变量占用的内存。一些更复杂的常数也可能属于这一类。无论是否将字符串文本"I don't want this cleared, but completely gone"
复制到i_want_to_delete_this
变量,它都很可能驻留在那里。
堆栈变量
局部变量和函数参数。它们出现在您的代码中。当您进入该变量的作用域时,内存会被分配,当您离开作用域时会自动删除:
{ //beginning of the scope
int foo = 42; // sizeof(int) bytes allocated for foo
...
} //end of the scope. sizeof(int) bytes relaimed and may be used for other local variables
请注意,当启用优化时,局部变量可能会被提升到寄存器,并且根本不消耗RAM内存。
堆变量
堆是你自己管理的唯一一种记忆。在纯C中,使用malloc
在堆上分配内存,并使用free
释放内存,例如
int* foo = (int*)malloc(sizeof(int)); //allocate sizeof(int) bytes on the heap
...
free(foo); //reclaim the memory
请注意,foo
本身是一个局部变量,但它指向堆内存的一部分,您可以在其中存储整数。
C++中的相同内容看起来是:
int* foo = new int; //allocate sizeof(int) bytes on the heap
...
delete foo; //reclaim the memory
堆通常用于变量的存在时间必须比作用域长得多的情况,通常取决于一些更复杂的程序逻辑。
当执行离开函数或子语句时,自动变量,即不使用malloc
或new
运算符的变量,将被删除。
在函数外声明的变量将保留在内存中,直到程序终止。
此外,我将重点关注程序的正确性和健壮性。如果程序不适合您平台的内存,只需担心RAM或内存使用情况。
在现实世界中,即工作场所,大多数由程序处理但不适合内存的数据可以被分割成多个部分,每个部分都单独处理(但也有一些例外)。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用