0
private:
 // data containing character strings
 // shared by Strings when copying/assigning
 struct SharedData
 {
   char *data; // 0-terminated char array
   size_t n;      // number of non-0 characters in string
   size_t count;  // reference count, how many Strings share this object?
 };

 SharedData *shared; //here i don't understand how to use.

我如何使用 n?

我只是这样做吗

shared -> n = 3;

我不断收到分段错误,所以我不知道我在做什么。我想获取字符串的长度,然后将其传递给 n 进行存储

4

4 回答 4

3

您的类包含一个指向SharedData 的指针。您需要使该指针指向某些东西,大概是通过这样做

shared = new SharedData();
shared->n = 3;
// etc.

共享内的数据也是如此

shared->data = new char[100];
strcpy(shared->data, ...);

我有一种感觉,如果你还没有很好地掌握指针,这对你来说将是一项相当艰巨的练习。

于 2013-09-27T08:41:03.787 回答
2

您使用的是 C++11 编译器吗?你为什么不让它更容易一点?

struct SharedData
{
   std::string data;
   size_t count;  // reference count, how many Strings share this object?
};

std::shared_ptr<SharedData> shared = std::make_shared<SharedData>();

如果您不需要引用者数量的实际计数,您只想知道是否有人引用您的数据,只需使用std::shared_ptr<std::string>. 当所有引用都消失时,它将跟踪引用并销毁字符串对象。

于 2013-09-27T08:46:19.180 回答
2

您应该先分配一些内存:

SharedData *shared = new SharedData;
shared->n = 3;

最好使用这样的东西:

struct SharedData {
    SharedData(size_t Capacity) : data(0), capacity(Capacity), length(0), count(1) {
        data = new char[capacity];
    }
    ~SharedData() {
        if (--count <= 0) delete [] data;
    }
    char *data; // 0-terminated char array
    size_t length;      // number of non-0 characters in string
    size_t capacity;
    size_t count;  // reference count, how many Strings share this object?
};
SharedData* shared = new SharedData(1000);

编辑:当然,这个简短的示例缺少复制构造函数并以适当的方式处理引用计数。但这不是这个答案的主题。

于 2013-09-27T08:39:36.640 回答
2

修改内存中未分配的点是未定义的行为。

您必须为有效地址分配内存shared或将其设置为有效地址。

class Class
{
private:

  SharedData *shared;

  ...

public:

  Class() : shared(new SharedData()) {}

  ~Class() { delete shared; }

  void doSomething() { shared->n = 3; }

};

当你可以使用智能指针时,尽量不要使用裸指针:

class Class
{
private:

  std::unique_ptr<SharedData> shared;

  or

  std::shared_ptr<SharedData> shared;

  ...

public:

  Class() : shared(new SharedData()) {}

  void doSomething() { shared->n = 3; }

};
于 2013-09-27T08:41:09.027 回答