使用指针返回一个类对象

时间:2016-12-10 05:22:31

标签: c++ pointers return destructor dynamic-allocation

我有一个班级

class Foo
{
    public:
    char* ptr;
    Foo()  { ptr=new char [10]; }
    ~Foo()  { delete [] ptr;  }
};

我已经知道返回这个类的对象是不可能的,因为动态分配的指针是delete并且在调用函数中创建一个悬空指针

那我怎么能返回这个类的一个对象?

Foo Bar ()
{
    Foo obj;
    return obj;
}

可以通过添加复制构造函数

来解决
Foo::Foo(const Foo& obj)
{
    ptr = new char [10];
    for( int i = 0 ; i < 10 ;++i )
        ptr [i] = obj.ptr[i];
} 

功能为

Foo Bar ()
{
    Foo obj;
    return Foo(obj);     //invokes copy constructor
}

注意这些只是我想要的实际课程的代表,并不是根据推荐标准创建的(即请不要告诉我使用std::string或{{ 1}})。

1 个答案:

答案 0 :(得分:0)

  

那我怎么能返回这个类的一个对象?

您需要实现正确管理内存的复制构造函数和复制赋值运算符。

// Copy constructor
Foo(Foo const& copy) : ptr(new char[strlen(copy.ptr)+1])
{
  strcpy(ptr, copy.ptr);
}

// Copy assignment operator
Foo& operator=(Foo const& rhs)
{
   // Don't do anything for self assignment
   if ( this != &rhs )
   {
      delete [] ptr;
      ptr = new char[strlen(rhs.ptr)+1]);
      strcpy(ptr, rhs.ptr);
   }
   return *this;
}

如果ptr总是10 char的数组,那么您需要重新考虑复制构造函数和复制赋值。

// Copy constructor
Foo(Foo const& copy) : ptr(new char[10])
{
  memcpy(ptr, copy.ptr, 10);
}

// Copy assignment operator
Foo& operator=(Foo const& rhs)
{
   // Don't do anything for self assignment
   if ( this != &rhs )
   {
      memcpy(ptr, rhs.ptr, 10);
   }
   return *this;
}