C++ 如何删除C++;

C++ 如何删除C++;,c++,visual-studio,visual-c++,types,C++,Visual Studio,Visual C++,Types,我想在我的程序中释放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 ev

我想在我的程序中释放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
}

自动变量,即不使用
malloc
new
运算符的变量,在执行离开函数或子状态时被删除

函数外部声明的变量将保留在内存中,直到程序终止

此外,我将重点关注程序的正确性和健壮性。如果程序不适合您平台的内存,只需担心RAM或内存使用情况


在现实世界中,在工作场所,大多数由程序处理但不适合存储的数据都可以分割成多个片段,每个片段都可以单独处理(不过也有一些例外)

有三种变量。根据内存管理的类型不同

全局变量

它们位于程序的特殊部分。它们在程序启动时出现,在程序结束时消失。您不能做任何事情来回收全局变量占用的内存。 一些更复杂的常数也可能属于这一类。您的字符串文字
“我不想清除它,但它完全消失了”
很可能会驻留在那里,不管您是否将它复制到
我想删除这个
变量

堆栈变量


局部变量和函数参数。它们出现在您的代码中。当您输入该变量的作用域时,会分配内存,当您离开该作用域时,会自动删除内存:

{ //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

堆通常使用的变量必须比C++长很多,通常取决于一些更复杂的程序逻辑。变量超出范围时会发出嘶嘶声,句号。毕竟C++是编译语言,而不是解释语言,大概你在某个函数中声明了这个字符串。当函数返回时,字符串不再存在。限制对象的范围和资源使用。不要明确地担心它。“当您输入该变量的作用域时会分配内存”-不,它总是(对于我所知道的所有编译器)在输入到包含该变量的函数时分配。函数所需的最大内存量在函数输入时分配,但如何将内存分配给不同范围内的变量则是另一回事。如果您有两个作用域,一个接一个

{int x;..}{int y;..}
您将只消耗堆栈内存的
sizeof(int)
,而不是
2*sizeof(int)
。编译器知道在第一次
}
时可以回收内存。这个回收是“免费的”-没有机器指令。为什么当代码“C++ > <代码> >时,代码< > C+<代码>动态分配?@ CyGNUS是高度编译/优化的依赖。@ Galik是的,我包含C++版本的完整性。