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进行存储
答案 0 :(得分:3)
您的类包含一个指针到SharedData。你需要让指针指向某个东西,大概是通过这样做
shared = new SharedData();
shared->n = 3;
// etc.
共享
中的数据也是如此shared->data = new char[100];
strcpy(shared->data, ...);
我觉得如果你还没有很好地掌握指针,那对你来说这将是一项非常艰苦的练习。
答案 1 :(得分: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);
编辑:当然,这个简短的示例缺少复制构造函数和处理引用计数的适当方式。但这不是这个答案的主题。
答案 2 :(得分: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; }
};
答案 3 :(得分: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>
即可。当所有引用都消失时,它将跟踪引用并销毁字符串对象。