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()の呼び出しは、intの配列を新しくしています。ただし、「delete [] p1;」と記述して指示するまで、この割り当てられたメモリブロックは解放されないことに注意してください。

于 2012-10-10T21:36:19.073 に答える