2011-05-09 13 views
1

私はJavaプログラマですが、今ではC++で少しのコードを書く必要があります。私は数年前にC++の基礎を学んだので、私は本当にうまくいきません。C++ mallocエラー

私は、多項式を記述する小さなクラスを書いています。ここでは、次のとおりです。

#include "Polynom.h" 
#include <iostream> 

using namespace std; 

Polynom::Polynom() 
{ 
    this->degree = 0; 
    this->coeff = new int[0]; 
} 

Polynom::Polynom(int degree) 
{ 
    this->degree = degree; 
    this->coeff = new int[degree + 1]; 
} 

Polynom::~Polynom() 
{ 
    delete coeff; 
} 

void Polynom::setDegree(int degree) 
{ 
    this->degree = degree; 
} 

void Polynom::setCoeffs(int* coeff) 
{ 
    this->coeff = &*coeff; 
} 

void Polynom::print() 
{ 
    int i; 
    for(i = degree; i >= 0; i --) 
    { 
     cout<<this->coeff[i]; 
     if(i != 0) 
      cout<<"x^"<<i; 
     if(i > 0) 
     { 
      if(coeff[i - 1] < 0) 
       cout<<" - "; 
      else 
       cout<<" + "; 
     } 
    }  
} 

さて、私は度と多項式の係数を読み込み、コンソールにそれを印刷してみました。ここにそのコードがあります:

#include <iostream> 
#include "Polynom.h" 
using namespace std; 

int main() 
{ 
    int degree; 

    cout<<"degree = "; 
    cin>>degree; 
    int* coeff = new int[degree]; 
    int i; 
    for(i = 0; i <= degree; i++) 
    { 
     cout<<"coeff[x^"<<i<<"] = "; 
     cin>>coeff[i]; 
    } 
    Polynom *poly = new Polynom(degree); 
    //poly->setDegree(degree); 
    poly->setCoeffs(coeff); 
    cout<<"The input polynome is: "; 
    poly->print(); 
    return 0; 
} 

コードをコンパイルするとすべてが問題ありません。走っているときににもの度合いを与え、いくつかの係数を与えると、プログラムは正常に実行されます。 しかし:私は(例えば、3または5用)奇数度を定義し、係数を与える場合、プログラムはpolynomeを印刷すると、次のエラーを返しません。

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 

これはなぜ起こるのでしょうか?アレイに十分なメモリを割り当てられなかったのはどこですか?私はこのエラーのためにグーグルとthis pageにつまずいたが、そこに記載されている解決策は私にはあまり役に立たなかった。

私のコードに別の問題があるかもしれませんか?私は本当にあなたの助けに感謝します。

ありがとうございます。あなたのmain()機能で

+0

ヘッダーファイルを投稿できますか? –

+2

デストラクタで 'delete [] coeff'を実行する必要があります。 'std :: vector '( 'degree'メンバもなくなります)を使用してください。 –

+0

また、ポリを削除してください。 –

答えて

1

int *coeff = new int[degree]はあなたに包括的な0からdegree-1までの要素のインデックスを持つ長さ - degree配列を、提供します。あなたのループでは、要素0degree(これを含む)にアクセスしています。これは、あなたがdegree要素のためのスペースを割り当て、そこdegree+1の要素を入れているなど、

+0

すべての返信ありがとうございます。それは確かに気にする指数だった。まあ、私は学生バッジを得ました。私はC++の初心者、yeeeeyです。私はプログラミングを始めた数年前のような気がします。 :-) – Darie

4
int* coeff = new int[degree]; 
int i; 
for(i = 0; i <= degree; i++) 

やランタイムエラーが発生しない場合があり未定義の動作、です...動作は未定義です。

1

forループの文i <= degreeが原因です。配列のインデックスは0から始まるので、有効範囲は0->degree-1です。あなたが無効なメモリ位置に書き込んでいるので、あなたのプログラムは予期しない動作をします。

12

コードには多大な誤りがあります。 C++はJavaのようなものではなく、ポインタをJavaでの参照と同じように使用しているようです。

Polynom::Polynom() 
{ 
    this->degree = 0; 
    this->coeff = new int[0]; 
} 

これは、サイズがゼロの配列を作成します。これはC++では合法ですが、ほとんどあなたが望むものではありません。C++での

Polynom::~Polynom() 
{ 
    delete coeff; 
} 

配列は[]削除で削除する必要があります。

Polynom::~Polynom() 
{ 
    delete [] coeff; 
} 

この:

void Polynom::setDegree(int degree) 
{ 
    this->degree = degree; 
} 

は意味がありません - あなたは学位を変更するが、配列は、それが関連付けられていませんと。

void Polynom::setCoeffs(int* coeff) 
{ 
    this->coeff = &*coeff; 
} 

あなたはこれが何をしていると思いますか、あなたはどちらもそうは思わないです。そしてあなたにはメモリリークがあります。

これはちょうど初心者のためのものでした。Isuspectにはもっと悪いことがあります。あなたは2つのことをする必要があります:

  • C++の本を読んでください。あなたはプログラミング経験があるので、私はAccelerated C++をお勧めします。

  • あなたのJavaの知識は忘れてしまいます。私が言ったように、2つの言語はほとんど共通点がありません。

+0

+1は 'delete []'です。 – Naveen

+0

'this-> coeff =&* coeff;' ... OPがやろうとしていたことは、内部ポインタ 'coeff'を新しいアドレスに設定したと思われますか?この場合、 'this-> coeff = coeff;'はうまくいくでしょう。 – Dennis