传递引用和动态内存分配之间的差异是什么

时间:2018-06-12 05:01:04

标签: c++ pass-by-reference dynamic-memory-allocation

我只是想知道上面两者之间的区别。是否有一些叫做动态内存分配的东西,因为指针传递引用功能?

2 个答案:

答案 0 :(得分:1)

这两个是两回事。

在C ++中,通过引用传递是通过将&添加到函数中的参数来完成的:

void func(&a) {
   a = 5;
}

int main() {
    int a = 0;
    printf("%d", a);
    func(a);
    printf("%d", a);
    return 0;
}

上面的代码会将变量a的引用传递给func()。这会导致a方法中变量main()的值也发生变化。

动态内存分配是另一回事。它完成如下:

int* arr;
arr = new int[n];

其中n将在运行时中确定。您应该自行释放上面动态分配的内存,以避免内存泄漏。

答案 1 :(得分:-1)

您真正感兴趣的对比是介于传递和传递指针之间。

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;
}