1

以下是我面临的问题的一个小规模示例。在下面的示例中,我使用 int 指针,但在我自己的代码中,我实际上使用的是指向另一个类(节点类)的指针。

问题似乎是我正在使用按值指针调用(如果有这样的事情)。我不知道,我认为指针是通过引用。
我确实需要能够将多个指针传递给该方法,并且我真的不想为每个指针编写一个特定的方法。
当然,当我运行代码时,我会遇到某种错误,因为它试图访问尚未分配的指针。我不明白为什么如果我传递我想要的特定指针它不会初始化正确的指针。

任何帮助将不胜感激。

#include <iostream>

using namespace std;

class Test {
  private:
    int *p1;   
    int *p2;
    int sizeP1;
    int sizeP2;   
  public:
    int* getIntPointer() {return p1;}
    void initializeP1(int *ip,int n){
        sizeP1=n; 
        ip=new int[n];

        for(int i=0;i<n;i++)
            p1[i]=i;         
    }  
    void printP1() {
        for(int i=0;i<sizeP1;i++)
            cout<<p1[i]<<" "; 
    }
};

int main() {
    Test t;
    t.initializeP1(t.getIntPointer(),10);
    t.printP1(); //this fails.. but why? How can I fix it?

    return 0;
}
4

4 回答 4

4

问题是你初始化ip并填充p1

void initializeP1(int **ip,int n){
        sizeP1=n; 
        *ip=new int[n];

        for(int i=0;i<n;i++)
            *ip[i]=i;         
    }  
//call with p1

initializeP1(&p1, 10); // pass pointer to pointer so you can get return value.
于 2012-10-10T18:35:45.497 回答
2

问题是您的函数将内存分配给作为参数的指针的副本 - 此副本在函数退出时丢失。通过引用传递指针,而不是通过更改函数签名

  void initializeP1(int* &ip,int n){
                         ^

这样分配的内存仍然可以访问,并且您的指针将指向它

于 2012-10-10T18:35:03.533 回答
1

initializeP1将您的功能更改为以下内容会不会更容易:

int * initializeP1(int n)
{
    sizeP1 = n; 
    p1 = new int[n];

    for(int i = 0; i < n; ++i)
        p1[i] = i;
    return ip;
}

但是,这仍然存在问题,例如您可以重复调用它并导致大量内存泄漏。

最好为您的类使用适当的构造函数来执行 initializeP1 所做的操作,如下所示:

Test(int n)
{
    sizeP1 = n; 
    p1 = new int[n];

    for(int i = 0; i < n; ++i)
        p1[i] = i;
    return ip;
}

指针不是通过引用传递的,不。指针是值类型。如果您绝对必须让它看起来像这样,您会想要使用参考,但这是对语法的滥用,您应该以不同的方式来做。

于 2012-10-10T18:44:30.137 回答
0

对 t.getIntPointer() 的调用返回一个未初始化为合理值的指针。对 initializeP1() 的调用正在更新一个整数数组。但是要小心,这个分配的内存块不会被释放,直到你通过写“delete [] p1;”告诉它。

于 2012-10-10T21:36:19.073 回答