C++のメモリリークができないのを探す
-
25-09-2019 - |
質問
を使用してい目のVisual Studio2008用テーブルの開発OpenGLウィンドウ.私が複数の授業を作成する骨、関節、皮膚、身体はホルダーのための複数の関節、皮膚)を読み込むためのskel/皮膚ファイルです。
各授業が、私が使っているポインタ用のデータのために使用され=new int[○○○].私はデストラクタで各クラスの削除を行いますポインタを削除[○○○].
内に過剰とな表示機能していますの宣言に体のファイルを描画し、それを削除する身体の末尾に表示されます。ないメモリリークのどこかのプログラム。時間とともに、メモリ使用量だけが増え続けているのだと思う、一貫した金利を、私は解釈しているものになって削除されます。
くなった場合でも、過剰な表示機能ではないからだを削除する体クラス、または、地下鉄からも近くて便利。私は次の手順にメモリリーク検出についてVisual Studio2008とな報告漏れがない100%確なパワーを持った。んに堪能なC++のいかんを一望でき、誰でも参照です。
メイン:
void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Body *body = new Body();
body->readSkel("C:\\skel2.skel");
body->drawBody();
body = new Body();
body->readSkel("C:\\skel1.skel");
body->drawBody();
glutSwapBuffers();
body->~Body();
delete body;
}
からボディ:
Body::Body(){
skelFile = string();
skinFile = string();
totalJoints = 0;
joints = new Joint[25];
skin = new Skin;
}
Body::~Body(){
delete[25] joints;
delete skin;
}
解決
Body *body = new Body();
body->readSkel("C:\\skel2.skel");
body->drawBody();
body = new Body();
あなたが最初のものを削除しないので、あなたがBody
をリークしています。
そして、これます:
body->~Body();
delete body;
はちょうど奇妙です。あなたが明示的にそのようなデストラクタを呼び出すことはありません - 。delete
はデストラクタを呼び出すの世話をする。
このコード:
delete[25] joints;
も奇妙です。正しいフォームがあります:
delete [] joints;
あなたは非標準の構文を使用している、と25
は無視されます。詳細については、この質問をhref="https://stackoverflow.com/questions/1747976/c-array-delete-operator-syntax">
他のヒント
本物のプログラマは、任意の言語で、<ストライキ> Fortranのストライキ>のJavaを書くことができます! Javaはあなたが動的に(実質的に)すべてを割り当てることが必要ですが、C ++にはありません。
誰もが(少なくとも直接的に)それを指摘していないので、display
内のすべての動的割り当てを使用する理由はないように思えます。同じように何かをします:
void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Body body;
body.readSkel("C:\\skel2.skel");
body.drawBody();
Body body2;
body2.readSkel("C:\\skel1.skel");
body2.drawBody();
glutSwapBuffers();
}
あなたのreadSkel
は、既存のスケルトンデータをクリアした場合、あなたはbody2
を定義する必要はありませんが、それを知らなくても、これは安全なものを維持する簡単な方法です。
同様に、ボディのあなたの定義では、どちらの動的割り当てを要求する何かをやっているようには見えません。
class Body {
std::string skelFile;
std::string skinFile;
int totalJoints;
Skin skin;
Joint joints[25];
public:
Body() : totalJoints(0) {}
};
またはより良いまだ:
class Body {
std::string skelFile;
std::string skinFile;
Skin skin;
std::vector<Joint> joints;
public:
// presumably other stuff goes here...but you don't need a ctor or dtor.
};
このは、少なくとも、コードのこれらの部分に(何かをリークするための最も可能性を取り除く - 私たちはあなたの肌や合同クラスを見ていないので、彼らがやっているかもしれないもの...
これは役立つだろうが、私は希望ます:
ダブルはあなたの構文をチェックします。int * fooという=新しいint型[サイズ];削除[] FOO;
両親もデストラクタが空の文であっても、デストラクタが含まれています。
動的メモリを使用していますすべての子クラスを確認してくださいヨッヘンKalmbach にはあなたの友達です。