2011-12-29 7 views
0

"ヒープ"に整数を保持するクラスを持つC++プログラムを作成しようとしていますが、クラスの最初のアイテムを返すメソッドpop()それ。これは、これまでの私のコードです:C++の一連の整数へのポインタを使用

#include <iostream> 
using namespace std; 

class LinkList { 
int *values; //pointer to integers stored in linklist 
int number; // number of values stored in linklist 
public: 
LinkList(const int*, int); // Constructor (method declaration) 
int pop(); // typically remove item from data structure (method declaration) 

}; 

LinkList::LinkList(const int *v, int n){ 
number = n; 
*values = *v; 
int mypointer = 1; 
while (mypointer<n) { 
    *(values+mypointer) = *(v+mypointer); 
    mypointer++; 
} 
} 


int LinkList::pop() { 
if (number>0) { 
    int returnme = *values; //get the first integer in the linklist 
    number--; 
    values++; //move values to next address 
    return returnme; 
} 
else {return -1;} 
} 



int main() { 
int test[] = {1,2,3,4,5}; 
LinkList l1(test,5); 
cout << l1.pop() << endl; 
LinkList l2(test,5); 
cout << l2.pop() << endl; 
return 0; 
} 

問題は、私がメインメソッドから4番目と5番目の行を削除した場合、そのは*値= * Vラインに失敗し、私はもはやこの問題を得ることはありませんので、そのメモリ管理の事に行く。

私がやりたいことの値は内の整数でメモリの連続ビットを指すように取得することです。私は(これのために配列を使用しようとしたが、ちょうどポップで返さランダムメモリアドレスを取得しておくいる)

背景私はJavaでプログラミングしていますが、私は2ヶ月間C/C++しか使っていませんでした。私はEclipse IDEをubuntuで使っていますが、デバッガの基本的な使い方はできますが、彼らが私の画面に合っていなければ、何かできない。

+0

C++コースからのエクササイズ – Heidi

答えて

1
*values = *v; 

この行のvaluesポインタを初期化する前に参照してください。これが後のエラーの原因です。mainの最初の3行のエラーは、単に運が原因です。 values = new int[n]でスペースを割り当て、デストラクタでdelete[] valuesで割り当てを解除する必要があります。 std::vectorこれはきれいで安全な方法で動作します。

+0

thats、それはやったよ。 – Heidi

+0

配列の長さを知っているとき、配列に保持されている値を 'delete [] values'がどのように削除するのですか? – Heidi

+0

@Heidi:[この質問を参照](http://stackoverflow.com/questions/975792/how-does-delete-know-the-size-of-an-array) – thiton

1

おそらく問題は、ポインタではなく、整数 - マイポインタをインクリメントしていることです。整数に1バイト以上のスペースが必要な場合は、エラーが発生する可能性があります。あなたはポインタを宣言し、その代わりにインクリメントすることができますか?

4

あなたは未定義の動作(UB)ある行*values = *v;で初期化されていないポインタ(values)を参照解除されています。この行が言っていることは、 "valuesが指す値をvが指す値に割り当てます。"ということです。このロジックの問題は、valuesはまだ何も指していないということです。このUBの結果はあなたが受け取るクラッシュです。

const int*をコンストラクタに渡して、これらの値を変更するなど、このコードには他にも多くの問題があります。最大の問題は、これが実際のリンクされたリストではないということです。

+0

技術的には、const intポインタの値後で変更されるのではなく、 "LinkList"の内部ストレージにコピーされます。これは正しく、 'std :: vector'の2つのイテレータのコンストラクタを構築しようとする試みですが、他のエラーについては正しいです。 – thiton

1

メンバー変数valuesは、初期化されていないメモリへのポインタです。数字をコピーする前に、有効なメモリを指し示す必要があります。例:

また、実際には数値を格納するためにメモリ配列を使用しているのに、なぜこれをリンクリストと呼びますか?

関連する問題