[解決済み] malloc() : メモリ破壊 (高速) c++
質問
私はc++の初心者で、Point(x,y,z)セットの凸包を計算するために
C++
.
mainメソッド内で以下のメソッドを呼び出しています。
vector<Point> convexHull(Point Points[], int n) {
vector<Point> v;
// Find the bottommost Point
int ymin = Points[0].getY();
int min = 0;
for (int i = 1; i < n; i++) {
int y = Points[i].getY();
// Pick the bottom-most or chose the left most Point in case of tie
if ((y < ymin) || (ymin == y && Points[i].getX() < Points[min].getX()))
ymin = Points[i].getY(), min = i;
}
// Place the bottom-most Point at first position
Points[min] = Points[0].swap(Points[min]);
// Sort n-1 Points with respect to the first Point. A Point p1 comes
// before p2 in sorted ouput if p2 has larger polar angle (in
// counterclockwise direction) than p1
p0 = Points[0];
qsort(&Points[1], n - 1, sizeof (Point), compare);
// Create an empty stack and push first three Points to it.
stack<Point> S; // on debug the project I find that the problem is here
S.push(Points[0]);
S.push(Points[1]);
S.push(Points[2]);
// Process remaining n-3 Points
for (int i = 3; i < n; i++) {
// Keep removing top while the angle formed by Points next-to-top,
// top, and Points[i] makes a non-left turn
while (orientation(nextToTop(S), S.top(), Points[i]) != 2)
S.pop();
S.push(Points[i]);
}
// Now stack has the output Points, print contents of stack
while (!S.empty()) {
Point p = S.top();
cout << "(" << p.getX() << ", " << p.getY() << ", " << p.getZ() << ")" << endl;
v.push_back(Point(p.getX(), p.getY(), 0));
S.pop();
}
return v;
}
このようなエラーが発生します。
*** glibc detected *** /home/user/NetBeansProjects/DGILOG-ask/dist/Debug/GNU-Linux-x86/dgilog-task: malloc(): memory corruption (fast): 0x08de1238 ***
同じエラーについてウェブで検索してみましたが、どうすればいいのかわかりません。
ポイント.cpp
#include <iostream>
#include <math.h>
#include <ostream>
using namespace std;
#include "Point.h"
Point::Point() : x(0), y(0), z(0) {
}
Point::Point(ostream &strm) {
strm << "Type the abscissa: ", cin >> this->x;
strm << "Type the ordinate: ", cin >> this->y;
strm << "Type the applicate: ", cin >> this->z;
}
Point::Point(float x, float y, float z) : x(x), y(y), z(z) {
}
/**
* Destructor
*/
Point::~Point() {
}
//Other methods
float Point::dist2D(Point &other) {
float xd = x - other.x;
float yd = y - other.y;
return sqrt(xd * xd + yd * yd);
}
float Point::dist3D(Point &other) {
float xd = x - other.x;
float yd = y - other.y;
float zd = z - other.z;
return sqrt(xd * xd + yd * yd + zd * zd);
}
Point Point::swap(Point p) {
Point aux(x, y, z);
x = p.x;
y = p.y;
z = p.z;
return aux;
}
void Point::print(ostream &strm) {
strm << "Point(" << this->x << "," << this->y << "," << this->z << ")" << endl;
}
bool Point::operator<(const Point &p) const {
return x < p.x || (x == p.x && y < p.y);
}
ありがとうございます。
どのように解決するのですか?
完全なプログラムを投稿されていないので、ここで注意すべき点を挙げておきます。
convexHull(Point Points[], int n)
この関数では、n が Points 配列の範囲内であるかどうかをチェックしていません。 関数全体を通してvectorを使用する必要があります。 例えば
int ymin = Points[0].getY();
int min = 0;
for (int i = 1; i < n; i++) {
int y = Points[i].getY();
第一引数にNULLポインタを渡したり(あるいは無効なポインタでも)、nが大きすぎるとアクセス違反になりますね。 ベクターを使えば、これらの問題は大幅に軽減されるか、完全に取り除かれます。 ベクターでは、size() メンバ関数があり、Point が適切な数のエントリを持っていることを確認するためのサニティ・テストを行うことができます。 今のところ、このようなテストを関数内で行う方法はありません。
次の課題
S.push(Points[0]);
S.push(Points[1]);
S.push(Points[2]);
ポイントに少なくとも3つのエントリがあることをどうやって知るのですか? わからないし、その関数には確認する方法がない。 C++を使っているのなら、意図的にCのようなスタイルでコーディングする習慣はないはずです。 せっかくvectorがあるのだから、その利点を生かしましょう。
次号予告
qsort(&Points[1], n - 1, sizeof (Point), compare);
Point が何であるかを投稿していないため、Points が POD 以外の型である場合、qsort() のこの使用法は未定義の動作につながります。
qsort() の使用を停止する . C++プログラムの中でqsort()を使用することは、そのコーダーが1) Cプログラマーで、慣れたものを使っている (その結果、通常予想外の結果になる) か、2) C++プログラムを正しく書くための指針として、Cの本やプログラムを読んでいる新米C++プログラマーであることを示すものです。
std::sort()を使いましょう -- あなたはCアプリケーションではなく、C++アプリケーションを書いているのです。 std::sortはタイプセーフで、使い方も設定も簡単で、POD型でも非POD型でも、厳密な弱順序に従えば動作する。
関連
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] Androidでアプリケーションのメモリ使用量を確認するにはどうすればよいですか?
-
[解決済み] アプリケーションやプロセスの実際のメモリ使用量を測定するにはどうすればよいですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み】ローカル変数のメモリはスコープ外からアクセスできる?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】C++の余分な資格エラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】変数やフィールドがvoid宣言されている