矢量到函数内的数组

时间:2015-04-13 20:44:58

标签: c++ arrays vector

我有一个函数可以通过先将值放入向量来填充动态数组。

void fillArray(int*& arr) {
    vector<int> temp;
    for(int i = 0; i < 10; i++) {
        temp.push_back(i);
    }
    arr = &temp[0];
}

int main() {
    int* arr;
    fillArray(arr);
    for(int i = 0; i < 10; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

输出:

0 1 2 3 4 5 6 7 8 9

基于this answer,我使用的代码只创建了一个指向向量内部数组的指针 - 但是在离开函数范围后,所述向量被销毁。那为什么在事实之后打印数组会给我正确的输出呢?

根据this问题的答案,我确实应该收到错误。那么为什么这样呢? [Runnable version]

3 个答案:

答案 0 :(得分:1)

您最终会遇到未定义的行为。内存可能被标记为空闲,但之前的内容可能仍在该内存位置。这就是你所看到的。下一次内存分配可能会用垃圾填充该空间。

我通过在函数退出后分配另一个int向量来稍微修改你的例子,现在你看到打印向量中有垃圾了。 。

http://ideone.com/DLy1PF

int* v;
dothings(v); 
vector<int> temp = {1,2,3,2,1,2,3,12,3,1,2,3,1,23,1,2,3,1,23,1,2,3,1,3,12};
for(int i = 0; i < 10; i++) {
    cout << v[i] << endl;
}

输出:12, 135065, 2, 3, 4, 5, 6, 7, 8, 9

答案 1 :(得分:0)

这就是所谓的未定义行为。系统可能或者不能按照您的预期给您结果!!

答案 2 :(得分:0)

这是未定义的行为,并且是悬空指针错误的定义。请注意, undefined 并不总是意味着它会立即返回不正确的内容或抛出异常 - 在这种情况下,可能需要一些时间才能在数据中发生错误。

当指针被销​​毁时,内存不会立即释放或重置为0x0000... - 这将占用系统上的时间和资源。相反,操作系统将内存标记为空闲,并在进行更多内存请求时再次分配内存。由于您在创建悬空指针后立即进行测试,因此操作系统尚未重新调整内存,并且这些位保留为函数所生成的位。如果您要运行十几个其他功能,那么可能会看到错误的输出,因为操作系统已将内存提供给正在进行更改的其他内容。