传递堆栈对象地址以进行复制

时间:2018-03-28 09:40:03

标签: c++ pointers

我已经看到了以与execute()函数的以下实现类似的方式传递参数的代码。它完全合法还是可以接受?它似乎工作,但它是否正确?你能解释一下值向量是怎么回事吗?

#include <vector>
#include <iostream>

using namespace std;

vector<string> GetValues()
{
    return vector<string> {"hello", "world"};
}

void execute(vector<string>* values)
{
    *values = GetValues();
}

int main()
{
    vector<string> values;
    execute(&values);
    for (size_t i = 0; i < values.size(); ++i)
    {
        cout << values[i].c_str() << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是合法的,虽然当然是一个人为的例子。

记住CompSci中术语“堆栈”的含义。它是一个包含多个元素的容器,但是一个元素被指定为顶部。使用推送和弹出操作更改哪个元素。因此,它是典型的“后进先出”数据结构。

这也是我们讨论函数调用堆栈的原因。函数调用和函数返回的工作方式与push和pop相同。最后调用的函数是“top”,这就是代码执行的地方。此外,对于调用堆栈上的所有函数,局部变量都是有效的,但只有顶层函数的那些函数可以直接访问

我已经“直接”加粗了,因为您的示例显示了一种解决方法。您将指针从main传递到execute,以便在values运行时间接访问main中的execute。这是安全的,因为它是一个堆栈。 main运行时execute无法返回; execute必须回头。因此execute可以安全地使用values中的main

由于堆栈语义,这一切都是安全的。但如果你开始偏离这个,例如通过存储指针,您需要开始担心对象的生命周期。这有点复杂,因为C ++没有垃圾收集。尽可能使用堆栈语义,它更容易。