C++ C++;这些是否构成内存泄漏?
我一直在做一个简单的光线跟踪器,内存不足。我下载了Visual studio的Visual Leak Detector,它告诉我以下函数导致内存泄漏。但是,我不确定为什么这些会被视为泄漏:C++ C++;这些是否构成内存泄漏?,c++,memory-leaks,visual-leak-detector,C++,Memory Leaks,Visual Leak Detector,我一直在做一个简单的光线跟踪器,内存不足。我下载了Visual studio的Visual Leak Detector,它告诉我以下函数导致内存泄漏。但是,我不确定为什么这些会被视为泄漏: Point* Point::copy() { Point* result = new Point(x, y, z); return result; } Point* Point::crossProduct(Point* other) { double crossX = y*(*
Point* Point::copy() {
Point* result = new Point(x, y, z);
return result;
}
Point* Point::crossProduct(Point* other) {
double crossX = y*(*other).getZ() - z*(*other).getY();
double crossY = z*(*other).getX() - x*(*other).getZ();
double crossZ = x*(*other).getY() - y*(*other).getX();
Point* cross = new Point(crossX, crossY, crossZ);
return cross;
}
注意,我只是在创建并使用这里显示的copy函数之后才发现了关于copy构造函数的内容。如果我要重做这个项目,我会使用复制构造函数。现在,当我使用函数时,我确保对我使用的任何变量调用“delete”。例如:
Point* n = AB.crossProduct(&AC);
...
delete n;
我认为这应该处理任何内存泄漏,这是错误的吗?目视检漏仪是否无法识别泄漏已被处理,因为它位于单独的文件中?规则是:每个动态内存分配都应该有相应的释放。 除非遵循此规则,否则最终将导致内存泄漏。至少任何内存泄漏检测工具都会检测到它们。在程序的生命周期结束之前,可能有一些内存分配是不会释放的,但这些实例将非常少。除非你真正理解了这些概念,否则你不应该涉足其中 至于获得内存分配/释放的最简单方法,这项权利只是简单地使用
注意:是的,根据您显示的代码,您的处理似乎是正确的。请使用。这样,所有对象都将自动解除分配,您就不必担心内存泄漏。为什么不直接按值返回并按常量引用传递呢
Point Point::copy()
{
return Point(x, y, z);
}
Point Point::crossProduct(const Point& other)
{
double crossX = y * other.getZ() - z * other.getY();
double crossY = z * other.getX() - x * other.getZ();
double crossZ = x * other.getY() - y * other.getX();
return Point(crossX, crossY, crossZ);
}
当然,您的copy
函数只是一个穷人的复制构造函数/赋值运算符,因此请改用它们:
Point::Point(const Point& other)
: x(other.x)
, y(other.y)
, z(other.z)
{
}
Point& Point::operator=(const Point& other)
{
x = other.x;
y = other.y;
z = other.z;
return *this;
}
使用智能指针避免内存泄漏。虽然你的假设是正确的,但你为什么要使用
new
?通过按值返回这些简单对象,您可以修复可能存在的任何泄漏(并可能大量提高性能)。请重写代码,使其不使用new
。当然,这些复制/分配函数与隐式生成的函数完全相同,因此不要亲自编写它们。