1

そのため、シェイプクラスのコンストラクターに渡されるchar *にメモリを割り当てるのに問題があり、「malloc:*オブジェクト0x1001000e0のエラー:解放されるポインターが割り当てられませんでした」というエラーが発生し続けます。私はグーグルをたくさんしました、そして私は答えを見つけます、しかしそれらは意味がありません、私は何が悪いのか理解していません。shapeNameは、shapeの保護されたchar*メンバーです。正方形は形の子です。誰かが何が悪いのか説明していただければ幸いです。ありがとうございます。

私のコンストラクター:

Shape::Shape(Point* origin,char* name) {
   this->origin = origin;
   this->shapeName = (char*) new char(strlen(name)+1);
   strcpy(shapeName, name);
}

私のデストラクタ:

Shape::~Shape() {
   delete shapeName;
   delete origin;
}

スクエアのコンストラクター:

Square::Square(Point* origin, char* squareName, double side) 
: Shape(origin, squareName){
   side_a = side;
}

私の電話:

Square s(new Point(5,7),"Square - S", 12);
s.display();

cout << "The area of " << s.getName() << " is: " << s.area() << endl;
cout << "The perimeter of " << s.getName() << " is: " << s.perimeter();
4

1 に答える 1

5

これがあなたの問題です:

this->shapeName = (char*) new char(strlen(name)+1);

単一の文字を作成し、その値をstrlen(name)+1に設定しています。次に、strcpy()は(シングルバイト)割り当ての終わりをオーバーランし、ヒープ構造'delete'が操作を試みますが壊れています。

これは代わりに必要なものです(異なる括弧):

this->shapeName = new char[strlen(name)+1];

また、正確にしたい場合は、特別な「配列削除」を使用する必要があります。

delete[] shapeName;
于 2013-03-23T03:42:29.027 に答える