2012-01-05 20 views
-1

Testthis=&*Look_in;割り当てブレークをデバッグするときに、機能ヘッダーの最後のパラメータをchar Findthis[64]からchar * Findthisに変更しました。 Look_inにはメモリアドレスとメンバ値がありますが、Testthisにはそのポインタ位置が割り当てられていません。なぜこうなった?なぜ機能ヘッダーを変更すると、ポインタ割り当てが機能しなくなるのですか?

struct Node * ProbableMatch(struct Node * Look_in, int MaxNodes, 
char Findthis[64]) 
{ 
    char Findit[64]; 
    strcpy_s(Findit,64,Findthis); 
    struct Node * CurrentHighProb; 
    CurrentHighProb=new(Node); 
    struct Node * Testthis; 
    Testthis=new(Node); 
    Testthis=&*Look_in; 

    while((Testthis) || (i!=(ccounter-1))) 
{ //This Testthis does not cause exception 
    string str1; 
    string str2; 

    n1=sizeof(Testthis->NAME); 
    n2=sizeof(Findit); 

    n=0; 
    while((Testthis->NAME[n]!='\0') && (n<=n1)){ 
       //While Testthis->NAME here causes the exception 
     if(Testthis->NAME[n]=='-'){Testthis->NAME[n]=' ';} 
     n++; 
    }//end of while 

// _PROGRAMの別の部分_ __ _

std::string Findme; 
cout<<"Enter varible to find. Type quit to quit, case sensative."<<endl; 
cin>>Findme; 
char * writable = new char[Findme.size()+1]; 
std::copy(Findme.begin(),Findme.end(),writable); 
writable[Findme.size()] = '\0'; 

if((Findme.compare("quit")!=0)^(Findme.compare("Quit")!=0)^(Findme.compare("QUIT")!=0)){ 
    ProbableMatch(head,ccounter,writable); 
} 

delete [] writable; 

// _ NODE_ ___

struct Node 
{ public: 
    int VARID,counter,prob; 
    char NAME[64]; 
    char DESCRIPTION[1024]; 
    struct Node* next; 
}node, *pNode=&node; 
+3

どのような目障りですか。これはCタグのためのものです。 – sbi

+2

コードを減らして、関連性と形式を適切にしてください。 –

+1

Testthis = new(Node); < - その行はバグのようです。どうして新しいNodeオブジェクトを割り当てるだけですぐ次の行でそれをリークするのですか? CurrentHighProb = new(Node)と同じことです。ここでポインタがどのように動作するかについては混乱があるようです。 –

答えて

0

std :: string to char *変換がリークを引き起こしているようです。ここで提案されているよう

は、ベクタ・オプションに切り替え:How to convert a std::string to const char* or char*?

問題は去っていきました。私は後で実際のメモリをトレースする必要がありますが、私はそれが文字列のメモリがリンクされたリストの始まりのすぐ隣に置かれていることが奇妙であることがわかります。

0

は以上のCコードのように見えます。なぜC文字列と標準文字列を使用していますか?いずれにせよ、あなたのエラーは無関係であるように見えます。 Testthis = &*Look_inの前の割り当ては役に立ちません(newコールリークメモリはもちろんありません)。この場合、最初にノードLook_inを参照解除してからアドレスを取得する必要はありません。その文を単にTestthis = Look_inに変更するだけで済みます。

ただし、これが実行時エラーの場合は、Look_in != NULLか、他の場所では削除されていないことを確認してください。

ポインタ全体に小さな混乱があるようです。ここでは簡単なランダウンがあります。

ポインタは、値が格納されているメモリ位置を指します。したがって、ポインタを宣言してメモリ位置を割り当てると、そのポインタにメモリ内のどこかの項目を探すように指示します。有効なnull以外のポインタを逆参照すると、そのメモリ位置に保持されている値を取得できます。たとえば、

Node x[64]; // An array of 64 nodes 
Node * t = x; // t points to element 0 of x. Therefore, changing values of x changes values of t and changing values of t changes values of x 

さらに、メモリ割り当て/割り当て解除は別の話です。スタックメモリ(これらの宣言の両方に宣言されている)は、オペレーティングシステムによって管理されます。ただし、ヒープ割り当てはあなた次第です(つまり、new/delete)。

スタックとヒープの最大の違いは、ヒープメモリが機能の寿命を超えていることです。たとえば、各関数は変数を宣言するために独自のスタックフレームを取得します。ただし、関数が終了すると、スタックフレームは解放されます。ただし、ヒープメモリは、単一の関数の存続期間に排他的ではない値を保持できます。

簡単な例がこれです:上記の関数で

int* giveMeAnInt() 
{ 
    int x; 
    return &x; 
} 

、我々はローカル変数を宣言し、その値へのポインタとしてそのアドレスを返すようにしてみてください。しかし、関数が終了してから戻り値を返すと、その値はスタックからポップされます。これを正しく行うには、次のようにする必要があります。

int* giveMeAnInt() 
{ 
    int* x = new int; 
    return x; 
} 

2番目の例では、変数を宣言してそのアドレスを返します。しかし、newを使用する場合は、後でdeleteにする必要があることを忘れないでください。もう1つの簡単な例(例2のコードの作業バージョンを使用)

... 
int * z = giveMeAnInt(); 
cout<< *z << endl; 
delete z; // Free the memory allocated by the giveMeAnInt() function 
... 

これはすばらしい情報ですが、幸いです。

EDIT

あなたは...->NAME[n]でクラッシュしている場合は、おそらく、その後、NAME[n]存在しません。 をsizeof(Testthis->NAME)に事実上逆参照しているので、問題がポインタにないことに注意してください。ポインタの文字列内の文字数を検索する場合は、sizeof()ではなく、strlen()を使用する必要があります。

私たちが直面している問題は、配列とポインタの違いです。 char someArray[64]と宣言した場合は、sizeof(someArray) == 64となります。しかし、char* someArrayを宣言した場合、sizeof(someArray) == 4sizeof(char*) == 4以降、32ビットマシンと仮定しますが、現時点では定数は関係ありません)ではなく、実際の文字数ではありません。安全のためには、両方の宣言で期待どおりに動作するstrlen(someArray)を単に使用してください。

+0

ポインタへのポインタありがとう:Pでも、ここでも私の問題は説明されていません。ここで見ることができるように、http://i1140.photobucket.com/albums/n567/rand4505/cstuff/notnullpointer.jpgリストはNullではない、そしてここでは、http://i1140.photobucket.com/albums/n567/rand4505/cstuff/huh.jpg割り当ては起こっていません。 – John

+0

Findthisがchar Findthis [64]の場合、この問題は発生しません。 FindthisとTestthisは直接関連していないので、私の元の質問です。 – John

+0

その情報を表示する場所はどこですか?代入文が当然発生した後でなければなりません。その特定の声明がうまくいかない理由はありません。たとえば、行257が実行を終了していない場合、行257は割り当てられません。 – RageD

関連する問題