- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
使用 new
分配的内存之间有哪些技术差异?通过简单的变量声明分配的运算符和内存,例如 int var
? c++ 是否有任何形式的自动内存管理?
特别是,我有几个问题。首先,因为使用动态内存你必须声明一个指针来存储你使用的实际内存的地址,动态内存不是使用更多的内存吗?除非你声明一个数组,否则我不明白为什么指针是必要的。
其次,如果我要创建一个像这样的简单函数:
int myfunc() { int x = 2; int y = 3; return x+y; }
最佳答案
注:这个答案太长了。有时间我会删减的。同时,如果您能想到有用的编辑,请发表评论。
为了回答您的问题,我们首先需要定义两个名为 的内存区域。堆栈和 堆 .
堆栈
把堆栈想象成一堆盒子。每个框代表一个函数的执行。一开始,当main
被称为,地板上有一个盒子。您定义的任何局部变量都在该框中。
一个简单的例子
int main(int argc, char * argv[])
{
int a = 3;
int b = 4;
return a + b;
}
argc
的盒子。 (整数),
argv
(指向字符数组的指针),
a
(整数)和
b
(一个整数)。
int main(int argc, char * argv[])
{
int a = 3;
int b = 4;
return do_stuff(a, b);
}
int do_stuff(int a, int b)
{
int c = a + b;
c++;
return c;
}
main
)和
argc
,
argv
,
a
, 和
b
.在那个盒子的顶部,你有另一个盒子(用于
do_stuff
)和
a
,
b
, 和
c
.
a
和 b
是按值传递的。这就是为什么在 do_stuff
的框中有这些变量的拷贝的原因。 . free
或 delete
或这些变量的任何东西。当您的函数返回时,该函数的框被销毁。 int main(int argc, char * argv[])
{
int a = 3;
int b = 4;
return do_stuff(a, b);
}
int do_stuff(int a, int b)
{
return do_stuff(a, b);
}
main
,和以前一样)。然后,您有一个带有
do_stuff
的盒子(用于
a
)和
b
.然后,您有另一个盒子(用于
do_stuff
调用自身),再次使用
a
和
b
.然后是另一个。很快,您就会遇到堆栈溢出。
malloc
或
new
,在堆中分配了一 block 内存。您将获得一个访问该内存块的指针。
int main(int argc, char * argv[])
{
int * a = new int;
return *a;
}
a
的指针那指向那个内存。
a
是一个局部变量,所以它在 main
中的“盒子”int main(int argc, char * argv[])
{
int * intarray = create_array();
return intarray[0];
}
int * create_array()
{
int intarray[5];
intarray[0] = 0;
return intarray;
}
create_array
中“返回一个数组” .实际上,您返回了一个指针,该指针仅指向
create_array
的一部分。包含数组的“盒子”。当
create_array
时会发生什么返回?它的盒子被破坏了,你可以预料到你的阵列随时都会损坏。
int main(int argc, char * argv[])
{
int * intarray = create_array();
int return_value = intarray[0];
delete[] intarray;
return return_value;
}
int * create_array()
{
int * intarray = new int[5];
intarray[0] = 0;
return intarray;
}
intarray
毫发无损地逃脱。记得要
delete[]
不过在你完成之后。
关于c++ - 动态内存和 "ordinary"内存的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1021138/
我想将这个react组件中的箭头样式函数(at onChange)更改为普通函数。我是一个初学者,对我来说,并排查看两个版本很有帮助,因为我很难掌握新的箭头函数语法。 应该是可能的,但是使用“普通”函
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
使用 new 分配的内存之间有哪些技术差异?通过简单的变量声明分配的运算符和内存,例如 int var ? c++ 是否有任何形式的自动内存管理? 特别是,我有几个问题。首先,因为使用动态内存你必须声
在 Squeak 中创建一个新的子类似乎是通过向父类(super class)发送消息来完成的: Object subclass: #Boolean instanceVariableNames
在 Squeak 中创建一个新的子类似乎是通过向父类(super class)发送消息来完成的: Object subclass: #Boolean instanceVariableNames
初学者问题在这里!前段时间,我问了这个问题: Parse CSV records into a list of Classes ,这里也有更技术性的回答:How do I avoid having c
在我的 grails 应用程序中有一个带有 g:link 标签的 view - 它工作正常,但视觉效果有点尴尬.因此,我想用普通按钮伪装那个 g:link。 我尝试了 span class 和 inp
我试图了解如何使用 StreamTokenizer。我不明白 wordChars 和 ordinaryChars 之间的区别。这两种方法有什么区别? “普通”是什么意思? 最佳答案 普通意味着该字符是
使用 dimensional-tf 时包,是否可以使用“普通”Num 实例(即 Int、Double、Integer),而无需使用一个单元? 例如,此代码不进行类型检查(在 ghci 中): {-#
在 ECMAScript 2021 语言规范的术语和定义部分中,ordinary object定义为: object that has the default behaviour for the es
我在 Silverstripe 的管理员方面遇到了一些问题。我定义了一个数据库模型(请参阅下面的类定义),在我进行开发/构建之后,一切看起来都符合预期。当我尝试添加一个新的“包”时,所有“有一个”字段
总体而言,我是 SymPy 和 Python 的新手,目前我正在使用 Python 2.7 和 SymPy 0.7.5,目标是:a) 从文本文件中读取微分方程组b) 求解系统 我已经阅读了this q
在实现大多数算法(排序、搜索、图形遍历等)时,经常需要权衡以减少内存访问,同时增加普通操作。 Knuth 有一个有用的方法来比较各种算法实现的复杂性,方法是从特定处理器中抽象出来,只区分普通操作 (o
我是一名优秀的程序员,十分优秀!