1

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

事实上,调用者必须记住delete[]char *何时使用此函数。我想清理接口,以便delete[]在超出范围时在析构函数中调用它,但我不确定要使用什么。是否有一个智能指针可以接受char *

编辑:

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

4

2 回答 2

1

This is what OO programming is all about. Use std::string like comment above, or create a class that handles the data for you:

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

You'll probably also want to implement copy constructor and assignment operator (or privatize their use)...

Alternatively, use std::string as your base implementation but only expose what and how you want:

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

   int length() const {
      return std::string::length();
   }
};
于 2013-01-22T17:45:25.593 回答
0

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

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

于 2013-01-22T18:38:55.343 回答