c++ - 使用函数分配内存时会发生什么?
问题描述
当您通过函数返回新分配的变量时,是否会制作并传递副本并自动删除原始变量?
我假设没有内存泄漏
#include <iostream>
using namespace std;
int* allocater()
{
int* x = new int(1);
return x;
// what happens to the memory allocated to x ?
}
int main()
{
int* a = allocater();
int* b = allocater();
cout<<*a<<" "<<*b;
delete a;
delete b;
// all memory allocated has been deleted?
}
输出符合预期。
解决方案
当你返回一个新分配的变量时
具有动态存储的对象不是变量。
函数中有一个变量。它被命名为x
。变量的类型x
是,int*
即它是一个指向整数的指针。
是否复制并通过并自动删除原件?
x
是一个自动变量,因此当它超出范围时会自动销毁。该变量确实作为返回值复制到调用表达式中——尽管,如果编译器执行命名返回值优化,则编译器可以忽略该副本。如果类型很大,或者复制速度很慢(指针不是),这很有用。
具有动态存储的对象(其类型int
在您的程序中)不会自动销毁。必须使用delete
表达式释放它们。
推荐阅读
- delphi - dcc 命令行编译器的 -i 和 -u 参数有什么区别?
- java - 如何在 apache poi 中为 word 创建 commentsExtended.xml、commentsExtensible、commentdIds 文件
- javascript - 使用 map 去除复杂的 if 语句
- python - 找到一个短语/字符串并阅读与该短语/字符串对应的行
- apache-kafka - KStreams - “提交任务偏移量{}”的无数日志
- r - 当我输入代码时,R 只是在等待,它甚至不会给出错误。我该如何解决?
- c# - 正则表达式:字符串的开头和结尾带有指定长度的字母
- android - 如何在android studio中构建url时编码特殊字符?
- html - 为什么我不能为我的可滚动组件分配“scrollLeft”属性
- pyodbc - 用于在 pyodbc 中转换 DECIMAL('100.000') 的输出转换器