0

我一直在研究一个简单的光线追踪器,但我遇到了内存不足的问题。我为 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 是否无法识别泄漏已被处理,因为它位于单独的文件中?

4

3 回答 3

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;
}
于 2014-09-23T03:16:09.387 回答
4

规则是:
每个动态内存分配都应该有相应的释放。

除非遵循此规则,否则最终会导致内存泄漏。至少任何内存泄漏检测工具都会检测到它们。可能存在直到程序生命周期结束时才被释放的内存分配,但这些实例将非常少。除非你真的很好地理解了这些概念,否则你不应该涉足这些。

至于获得内存分配/释放的最简单方法,这只是简单地使用智能指针

注意:是的,根据您显示的代码,您的处理似乎是正确的。

于 2014-09-23T03:01:00.097 回答
1

与其手动管理内存,不如使用智能指针。这样,所有对象都将自动释放,您不必担心内存泄漏。

于 2014-09-23T03:01:43.840 回答