我一直在研究一个简单的光线追踪器,但我遇到了内存不足的问题。我为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*(*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;
}
注意我在创建和使用此处显示的复制功能后才发现有关复制构造函数的信息。如果我要重做项目,我会使用复制构造函数。现在,当我使用这些功能时,我一定要打电话给"删除"在我使用的任何变量上。例如:
Point* n = AB.crossProduct(&AC);
...
delete n;
我认为这应该处理任何内存泄漏我错了吗? Visual Leak Detector是否因为它在一个单独的文件中而无法识别泄漏?
答案 0 :(得分:5)
为什么不按值返回,并通过const引用传递?
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;
}
答案 1 :(得分:4)
规则是:
每个动态内存分配都应该有相应的重新分配。
除非遵循此规则,否则最终会导致内存泄漏。至少任何内存泄漏检测工具都会检测到它们。可能存在内存分配,在程序生命周期结束之前永远不会释放,但这些实例将很少。除非你真正理解这些概念,否则你不应该涉足这些概念。
至于获取内存分配/解除分配的最简单方法,这只是简单地使用 Smart pointers 。
注意:是的,根据您显示的代码,您的处理似乎是正确的。
答案 2 :(得分:1)
使用smart pointers而不是手动管理内存。这样,所有对象都将自动解除分配,您不必担心内存泄漏。