我一般都是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">';
答案 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
仅突出显示退出程序时的堆使用情况。