引用传递和动态内存分配之间有啥区别[关闭]
Posted
技术标签:
【中文标题】引用传递和动态内存分配之间有啥区别[关闭]【英文标题】:What is the diffrence between pass by reference and dynamic memory allocation [closed]引用传递和动态内存分配之间有什么区别[关闭] 【发布时间】:2018-11-21 09:36:25 【问题描述】:我只是想知道以上两者的区别。是否有所谓的动态内存分配,因为指针传递引用特性?
【问题讨论】:
您的问题没有意义,因为这两件事彼此无关。它们是完全正交的。 您能否澄清您的问题,因为这些操作根本不相似。一种是分配内存,一种是在其他地方传递信息。这就像买书和告诉朋友书架上有书的区别。 @SamiKuhmonen 我只是想知道它们是相似的还是相互依赖或不同或不相互依赖? 【参考方案1】:这两个是两个不同的东西。
在 C++ 中,按引用传递是通过将&
添加到函数中的参数来完成的:
void func(&a)
a = 5;
int main()
int a = 0;
printf("%d", a);
func(a);
printf("%d", a);
return 0;
上面的代码会将变量a
的引用传递给func()
。这会导致main()
方法中变量a
的值也发生变化。
动态内存分配是另一回事。如下:
int* arr;
arr = new int[n];
n
将在运行时确定。如上动态分配的内存应自行释放,避免内存泄漏。
【讨论】:
【参考方案2】:您真正感兴趣的对比是通过引用传递和通过指针传递。
void f(int* ip)
++*ip;
void g(int& ir)
++ir;
int main()
int i = 0;
f(&i);
std::cout << i << '\n'; // i is 1
g(i);
std::cout << i << '\n'; // i is 2
return 0;
在过去(当我们都用 C 编写代码时)没有引用,所以如果您希望能够创建一个对象,将其传递给一个函数,并让该函数修改该对象,您可以传递该对象的地址。在函数内部,您可以取消引用指针,这样您就可以修改传入的对象。这就是函数 f
所做的。
在 C++ 中,我们通过引用传递。这使您可以使用对象本身调用函数,而无需获取地址;并且在函数中,不需要取消引用指针。这就是函数g
的作用。
这两种方法都适用于您在堆栈上创建的对象以及您使用动态分配(即使用new
)创建的对象。以前的版本使用堆栈上的一个对象。这是一个使用new
创建的对象:
int main()
int *ii = new int(0);
f(ii);
std::cout << *ii << '\n'; // ii is 1
g(*ii);
std::cout << *ii << '\n'; // ii is 2
delete ii;
return 0;
【讨论】:
别忘了还有按值传递,这实际上不仅仅只是语法糖。 @GoswinvonBrederlow -- 我没有忘记;问题是关于引用和指针。以上是关于引用传递和动态内存分配之间有啥区别[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?