如何从抽象类中删除指针

时间:2017-05-14 07:38:38

标签: c++ pointers

我一般都是C ++和CS的新手。我无法理解如何完全防止内存泄漏。 我有一个名为shape的抽象类,我使用抽象类设置了一个指针。但是,当我尝试删除指针时,我仍然发现内存泄漏。 当用valgrind检查时,我收到了这条消息

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

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

shape.hpp

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

rectangle.hpp

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;}

rectangle.cpp

Shape *s1;

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

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

 delete s1;

 return 0;

 }

的main.cpp

$content = '<img src="../test1.png"> and <img src="../../test2.png"> and <img src="../test3.png">';

2 个答案:

答案 0 :(得分:0)

好,你编辑了你的问题,因为Rectangle构造函数是公共的。否则它完全无法编译。

您正确地将Shape析构函数定义为虚拟。 然后你删除了Shape指针。

我不习惯Valgrind,(我是C ++ Windows dev) 你确定Valgrind正在谈论指向Shape对象的指针吗?

你能列出仍在Valgrind中分配的指针值吗? 也许检查它的内存内容可以确保它不是导致这种分配的对象。

修改 你可以做的一个技巧,如果你不知道如何使用gdb逐步调试,你可以这样做:

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

如果您确实在输出中看到了跟踪,那么您将询问Valgrind诊断,而不是您的代码。

答案 1 :(得分: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仅突出显示退出程序时的堆使用情况。