本地分配的内存是否可以用于将来使用?
Can locally allocated memory be used for future uses?
For Code
int main() {
int test;
cin >> test;
while (test--) {
int arr[100];
arr[0] = 0;
}
return 0;
}
假设test = 3
.
对于第一个测试用例,数组在地址1000
处分配。对于在2000
处分配的第二个测试用例数组,依此类推。那么,如果我们有很多测试用例,我们之前分配的内存地址可以用于进一步分配吗?它会自动"释放(("我们之前分配的内存还是无法进一步使用?
arr
是一个具有块范围的自动变量。您可以使用它,获取其地址等,只能在声明它的块内。这就是语言规范所说的。当我们进入街区时,它"复活",当我们离开街区时,它就会死亡。每次执行通过该块时都会发生这种情况;循环的每次迭代。
编译器通过C++语言利用此要求。编译器很可能会在循环的每次迭代中重复使用相同的存储,而不是增加程序的内存使用量。
如果使用以下代码分配数组,则将在堆栈中分配内存。一旦你的代码到达作用域的末尾(这是大括号(,堆栈就会弹出,你不再能够访问那部分内存。是的,它会自动释放。
//anything here
{
int arr[100];
}
// can not access arr
如果要在大括号之后访问(我实际上的意思是更改范围(,则需要为该数组分配堆内存。您可以使用关键字或malloc()
来执行此操作new
关键字。但是这次您需要通过使用delete
和free()
,连续释放内存(不再自动释放(。
//anything here
int* arr
{
arr = new int[100];
}
// can access arr
delete [] arr
请记住,在堆栈中分配内存更快,但它的大小更大 是有限的。
如果您调用int arr[100]
,编译器将在堆栈中为您分配和释放内存(即在退出变量所在的范围后,它将被释放(。如果你想自己管理内存,你需要使用int *p = new int[100]
内存将被分配到你可以自己管理的堆中。内存将保持分配状态,直到您调用delete[]
。如果在不再需要内存后不使用delete[]
,则会出现内存泄漏。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 本地分配的内存是否可以用于将来使用?