2017-05-14 14 views
-1

私はC++とCSの方が一般的です。メモリリークを完全に防止する方法を理解できない。 私は、shapeという抽象クラスを持っており、抽象クラスを使ってポインタを設定しています。しかし、私は、ポインタを削除しようとすると、私はまだメモリリークを見つける。 valgrindのを確認した場合、私は抽象クラスからポインタを削除するには

==14227== HEAP SUMMARY: 
==14227==  in use at exit: 72,704 bytes in 1 blocks 
==14227== total heap usage: 3 allocs, 2 frees, 73,760 bytes allocated 
==14227== 
==14227== LEAK SUMMARY: 
==14227== definitely lost: 0 bytes in 0 blocks 
==14227== indirectly lost: 0 bytes in 0 blocks 
==14227==  possibly lost: 0 bytes in 0 blocks 
==14227== still reachable: 72,704 bytes in 1 blocks 
==14227==   suppressed: 0 bytes in 0 blocks 
==14227== Rerun with --leak-check=full to see details of leaked memory 
==14227== 

shape.hpp

class Shape 
{ 
protected: 
    int sides; 
    int length; 
    int width 

public: 
    virtual int perimeter() = 0; 
    virtual int area() = 0; 
    virtual ~Shape(){} 
}; 

rectangle.hpp

class Rectangle : public Shape 
{ 
public: 
    Rectangle(); 
    virtual int perimeter(); 
    virtual int area(); 
    void setLength(int); 
    void setWidth(int); 
    int getLength(); 
}; 

rectangle.cpp

Rectangle::Rectangle() 
{ 
setLength(2); 
setWidth(5); 
} 

void Rectangle::setLength(int l) 
{length = l;} 

void Rectangle::setWidth(int w) 
{width = w} 

int Rectangle::perimeter() 
{enter code here} 

int Rectangle::area() 
{enter code here} 

int Rectangle::getLength() 
{return length;} 

main.cppにこのメッセージが表示されます

Shape *s1; 

int main() 
{ 
s1 = new Rectangle(); 

cout << "Length: " << s1->getLength() << endl; 

delete s1; 

return 0; 

} 
+0

私は分かりませんが、それは偽陽性ではありませんか? s1ポインタをメイン関数に移動するか、明示的に0に設定してください。 – Lorenz

+0

Valgrindのメッセージに、メモリリークが検出されなかったことが明示的に記載されています。 – Justin

+0

0バイトが失われています。 「まだ到達可能」は、ヒープサマリに対応しています。 – Pyves

答えて

0

いいえ、Rectangleコンストラクタがpublicであるように質問を編集しました。さもなければ、それは簡単にコンパイルできませんでした。

Shapeデストラクタを仮想として正しく定義します。 そして、Shapeポインタを削除します。

私はValgrindに慣れていません(私はC++ Windowsデベロッパーでした) ValgrindはShapeオブジェクトへのポインタについて話していますか?

Valgrindでまだ割り当てられているポインタ値をリストできますか? メモリの内容をチェックすると、この割り当てを引き起こすのがあなたのオブジェクトではないことが保証されます。

EDIT:あなたが行うことができます 1つのトリック、あなたはステップバイステップ方法をgdbでのデバッグがわからない場合、あなたは:

virtual ~Rectangle() 
{ 
    std::cout << " proof the destructor has been called"; 
} 

あなたはトレースを見ていた場合出力すると、コードではなく、Valgrind診断に質問します。

+0

申し訳ありません私は手動ですべてを入力していました。アクセス変数をpublic – noua

+0

に変更しましたが、実際にコンパイルして実行しているコードを反映しています。 –

+0

はい、これは私が実際にコンパイルして実行しようとしているコードです。私はちょうど手動でコードを入力していた – noua

0

リークサマリーについて多少の混乱があるようです。

Valgrindのは、それがメモリリークを発見していないことを述べて:

==14227== LEAK SUMMARY: 
==14227== definitely lost: 0 bytes in 0 blocks 
==14227== indirectly lost: 0 bytes in 0 blocks 
==14227==  possibly lost: 0 bytes in 0 blocks 

プログラムが終了すると、次の行==14227== still reachable: 72,704 bytes in 1 blocksがちょうどヒープの使用を強調しています。

関連する問題