【问题标题】:Advice on proper handling, is this wise?关于正确处理的建议,这是明智的吗?
【发布时间】:2010-12-16 17:28:44
【问题描述】:

我正在用指针做一些时髦的事情,我担心我可能会让自己面临一些指针问题:

#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;
}

在我的 Vector2 类的操作符 dArr() 函数中,我担心通过返回一个指针,我会面临指针不会被删除并且会导致内存泄漏的问题。我担心是对的,在这种情况下是否有防止内存泄漏的解决方案?任何建议都将受到欢迎。

谢谢。

【问题讨论】:

  • 正如答案中所指出的,这不是泄漏,尽管这是一个问题。但是,如果您是泄漏,则可以返回某种智能指针。
  • @David Thornley:如果我在 main() 中为 v2 分配一个新指针,会不会导致旧指针泄露?
  • 不,指针是静态分配的,因此当它在 main 结束时超出范围时将被释放。指针指向的内存(通常是你泄漏的)也是静态分配的,并且已经超出范围,所以它已经被释放了!
  • @Kleist:所以指针 v2 最终可能指向一个不包含我期望的内存地址?在某些时候,可能会为该内存位置分配其他东西?
  • 是的,它可能会在某个时候。关键是你永远无法确定会发生什么,所以你不应该依赖它。 ;-)

标签: c++ pointers constants


【解决方案1】:

没有泄漏。一般来说,如果你没有new 任何内存,你就不能泄漏内存。但是您返回的是局部变量的地址,这会导致未定义的行为。

解决方案 1: 您可以在运算符 dPtr() 中使用静态双精度 [2]:

解决方案 2(更好): 将 x 和 y 存储在类中的 double[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;
}

我在double * 前面添加了 const,因为您所指的是 const。 (如果您不希望您班级的用户摆弄您的私人成员。)

【讨论】:

    【解决方案2】:

    你有一个不同的问题,你的记忆将在返回时被清除。但没有泄漏:P 结果应该是垃圾......返回这样一个指针的正确方法确实是新的内存或静态内存(不是一个好的选择,但非常快),新的内存可能确实不会被删除,你可以改为返回 std::vector 。

    【讨论】:

      【解决方案3】:

      最好使用静态数组容器,例如boost::array&lt;double, 2&gt;。原生数组有可怕的语法和语义——如果你想在那种容器中返回一个数组,你可以像往常一样返回对它的引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多