C ++类指针没有保存任何东西。

时间:2012-10-10 18:33:25

标签: c++ class pointers

以下是我所面临的问题的小规模示例。在下面的例子中我使用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 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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;
}

指针不是通过引用传递的,不是。指针是值类型。你想要使用引用,如果你必须使它看起来像这样,但它是滥用语法,你应该采用不同的方式。

答案 3 :(得分:0)

对t.getIntPointer()的调用返回一个未初始化为合理的指针。 对initializeP1()的调用正在新建一个int数组。 但是要小心,这个分配的内存块在你通过编写“delete [] p1;”之后才会被释放。