Я работал над простым трассировщиком лучей, и у меня проблемы с нехваткой памяти. Я скачал Visual Leak Detector для Visual Studio, и он сказал мне, что следующие функции вызывают утечки памяти. Я не уверен, почему это будет считаться утечками, однако:
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;
}
Примечание. Я узнал о конструкторах копирования только после создания и использования функции копирования, показанной здесь. Если бы я собирался повторить проект, я бы использовал конструктор копирования. Теперь, когда я использую функции, я обязательно вызываю «delete» для любой переменной, которую я использую. Например:
Point* n = AB.crossProduct(&AC);
...
delete n;
Я ошибаюсь, думая, что это должно справиться с любой утечкой памяти? Visual Leak Detector просто не может распознать утечку, потому что она находится в отдельном файле?
Почему бы просто не вернуть по значению и передать по константной ссылке?
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;
}
Правило таково:
Каждое динамическое распределение памяти должно иметь соответствующее освобождение.
Если не следовать этому правилу, у вас будут утечки памяти. По крайней мере любой из инструментов обнаружения утечки памяти обнаружит их так. Могут быть выделения памяти, которые никогда не освобождаются до конца срока службы программы, но таких экземпляров будет очень мало. И вам не следует баловаться с ними, если вы не очень хорошо понимаете концепции.
Что касается самого простого способа получить распределение / освобождение памяти, то это право просто использовать Умные указатели.
Примечание: Да, ваша обработка кажется правильной на основе кода, который вы показали.
Вместо того, чтобы управлять памятью вручную, используйте умные указатели. Таким образом, все объекты будут освобождены автоматически, и вам не придется беспокоиться об утечках памяти.