我有一个班级
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}})。
答案 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;
}