【问题标题】:C++ Class pointer is not saving anything.C++ 类指针没有保存任何东西。
【发布时间】:2012-10-10 18:33:25
【问题描述】:

以下是我面临的问题的小规模示例。在下面的示例中,我使用 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;
}

【问题讨论】:

    标签: c++ class pointers


    【解决方案1】:

    问题是你初始化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.
    

    【讨论】:

    • 我不确定如何正确地在此处进行语法高亮显示,但我确实将其更改为您在上面显示的方式。唯一的区别是我的 initializeP1 方法在类内部,我像您在 main 方法中显示的那样调用它。但是,我像这样通过了 p1 。 int* p=t.getIntPointer(); t.initializeP1(&p,10);
    【解决方案2】:

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

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

    这样分配的内存仍然可以访问并且你的指针会指向它

    【讨论】:

      【解决方案3】:

      将您的 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;
      }
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-03-22
          • 1970-01-01
          • 2013-11-11
          • 2020-12-09
          • 1970-01-01
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多