创建资源并将其返回以由调用者释放的最佳界面

时间:2013-01-22 17:39:20

标签: c++ raii

我有一个char*数组new'并在函数中初始化。通常我会使用std::string,但是数组以null终止,可能有多个'\0',我想捕获完整大小。

实际上,来电者在使用此功能时必须记得delete[] char *。我想清理界面,以便在析构函数超出范围时在析构函数中调用delete[],但我不确定要使用什么。是否有智能指针而不是char *

编辑:

我宁愿不使用std::string,因为不清楚这不是C风格的空终止字符串。我可以使用boost::scoped_array<char>吗?由于scoped_array是不可复制的,我如何从创建它的函数返回它?

2 个答案:

答案 0 :(得分:1)

这就是OO编程的全部意义所在。像上面的注释一样使用std::string,或者创建一个为您处理数据的类:

class MyObj {
private:
   char *data;
   int len;

public:
   MyObj( const char *data, int len ) {
      this->data = new char[...
      // do what you need here
   }

   const char* getStr() const {
      return data;
   }

   int getLen() const {
      return len;
   }

   ~MyObj() {
      delete [] data;
   }
};

您可能还想实现复制构造函数和赋值运算符(或私有化它们的使用)......

或者,使用std :: string作为基础实现,但只显示您想要的内容和方式:

class MyObj : private std::string {
public:
   // whatever you want here
   const char* data() {
      return c_str();
   }

   int length() const {
      return std::string::length();
   }
};

答案 1 :(得分:0)

2011年之前,您从函数返回动态数组的选择是std::stringstd::vector<char>boost::shared_array<char>。使用现代实现,您还可以使用std::unique_ptr<char[]>

我建议使用std::string来表示字符串。