C ++ - 无法修改类成员函数中的指针

时间:2015-11-17 09:32:20

标签: c++ pointers

我在A类中定义了一个函数getArray(),如下所示:

void getArray(int * arr){
    arr = new int[10];
    arr[0] = 1;
}

我想在getArray()中修改指针arr。我在main()中调用了函数getArray(),如下所示:

int main(){
    A obj;
    int * arr = new int[2];
    obj.getArray(arr);
    cout<<arr[0]<<endl;
    delete[] arr;
}

但是当我执行main()时,arr [0]的输出为0,而不是1.为什么?

实际上,我想为指针arr分配新内存,并在函数getArray()中设置数组的内容。然后我想获取数组的内容并在main()中释放指针arr。但我不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

未修改数组,因为您在getArray中重新分配了变量。这段代码可以使用:

void getArray(int * arr){
    arr[0] = 1;
}

您应该决定分配数组内存的位置。如果答案在main,那么您应该在此函数结束时解除分配:

int main(){
    A obj;
    int * arr = new int[2];
    obj.getArray(arr);
    cout<<arr[0]<<endl;
    delete[] arr;
}

如果数组应该在getArray中创建,那么你不需要在main中进行分配,你应该从getArray返回新指针,并且不要忘记解除分配:

int * getArray(){
    int * arr = new int[10];
    arr[0] = 1;
    return arr;
}

int main(){
    A obj;
    int * arr = obj.getArray();
    cout<<arr[0]<<endl;
    delete[] arr;
}

答案 1 :(得分:2)

因为您使用指针的副本调用getArray

您可以按值或按引用调用函数。使用指针看起来像是一个按引用调用,但它是一个按值调用,因为指针只存储一个引用。

你可以使用传递指针by-reference来实现你想要做的事情:void getArray(int *& arr)

BTW:我希望这段代码不在生产环境中,因为它有2个内存泄漏。

<强>更新

使用std::vector的示例:

示例1:

#include<iostream>
#include<vector>


struct A
{
    void getData(std::vector<int>& v){
        v = std::vector<int>(10, 0); //vector with 10 zeros
        v[0] = 1;
    } 
};

void printData(const std::vector<int>& v)
{
    std::cout << "v.size() = " << v.size() << std::endl;
    for(int value : v)
    {
        std::cout << value << std::endl;
    }
}

int main(){
    A obj;
    std::vector<int> v;
    obj.getData(v);
    printData(v);      
    return 0;
}

示例2:

#include<iostream>
#include<vector>


struct A
{
    std::vector<int> getData(){
        std::vector<int> v(10, 0); //vector with 10 zeros
        v[0] = 1;
        return v;
    } 
};

void printData(const std::vector<int>& v)
{
    std::cout << "v.size() = " << v.size() << std::endl;
    for(int value : v)
    {
        std::cout << value << std::endl;
    }
}

int main(){
    A obj;
    std::vector<int> v = obj.getData();
    printData(v);      
    return 0;
}