Советы по правильному обращению, это мудро? - PullRequest
3 голосов
/ 16 декабря 2010

Я делаю некоторые забавные вещи с указателями, и я боюсь, что могу оставить себя открытым для некоторых проблем с указателями:

#include <iostream>

class Vector2
{
private:
 double x;
 double y;

public:
 Vector2(double x, double y)
 {
  this->x = x;
  this->y = y;
 }

 Vector2(double coords[2])
 {
  x = coords[0];
  y = coords[1];
 }

 typedef double * const dArr;
 operator dArr()
 {
  double out[2] = {x, y};
  return out;
 }
};

int main()
{
 double ids[2] = {2.3 ,3.3};
 Vector2 v = ids;
 std::cout << 5 << std::endl;
 double vect[2] = {v[0], v[1]};
 double * const v2 = v;

 std::cout << vect[0] << " " << vect[1] << std::endl;

 while(1) { }

 return 0;
}

В функции оператора dArr () в моем классе Vector2 I 'Я обеспокоен тем, что, возвращая указатель, я открываюсь перед проблемами, когда указатель не будет удален и это приведет к утечке памяти.Правильно ли я беспокоиться, есть ли решение для предотвращения утечки памяти в этом случае?Любые предложения будут приветствоваться.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 16 декабря 2010

Там нет утечки.В общем случае вы не можете утечь память, если у вас нет new памяти.Но вы возвращаете адрес локальной переменной, что приводит к неопределенному поведению.

Решение 1: Вы можете использовать статический double [2] в операторе dPtr ():

Решение 2 (лучше): Храните x и y в двойном [2] в вашем классе и вместо этого возвращайте указатель на него:

#include <iostream>

class Vector2
{
private:
   double coords_[2];

public:
   Vector2(double x, double y)
   {
      coords_[0] = x;
      coords_[1] = y;
   }

   Vector2(double coords[2])
   {
      coords_[0] = coords[0];
      coords_[1] = coords[1];
   }

   typedef const double* const dArr;
   operator dArr() const
   {
      return coords_;
   }
};

int main()
{
   double ids[2] = {2.3 ,3.3};
   Vector2 v = ids;
   std::cout << 5 << std::endl;
   double vect[2] = {v[0], v[1]};
   const double * const v2 = v;

   std::cout << vect[0] << " " << vect[1] << std::endl;

   while(1) { }

   return 0;
}

Я добавил const вперед double *, поскольку это то, на что вы указываете, это const.(Если вы не хотите, чтобы пользователь вашего класса возился с вашими личными членами.)

0 голосов
/ 16 декабря 2010

Вам лучше использовать контейнер статического массива, например boost::array<double, 2>.Нативные массивы имеют ужасный синтаксис и семантику - если вы хотите вернуть массив в контейнере такого типа, вы можете просто вернуть ссылку на него, как обычно.

0 голосов
/ 16 декабря 2010

у вас другая проблема, ваша память будет очищена при возврате.но без утечек: P результат должен быть мусором ... правильный способ вернуть такой указатель - это действительно новая память или статическая память (не хороший вариант, но ужасно быстрый), новая память действительно не может быть удалена, выможет вернуть вместо него std :: vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...