【问题标题】:protobuf : The object created by add has the same memberprotobuf : add 创建的对象具有相同的成员
【发布时间】:2021-12-18 11:19:10
【问题描述】:

这是原型:

message GetIdKeyValueResp {
  optional int32 ret = 1;
  repeated IpInfo ips = 2;
}

message IpInfo {
  optional string ip = 1;
  optional string status = 2;
  optional uint64 update_time = 3;
  optional Disks disks = 4;
}

message DiskHistory {
  optional uint64 time = 1;
  optional string status = 2;
}

message Disk {
  optional uint32 index = 1;
  optional string status = 2;
  optional uint64 time = 3;
  repeated DiskHistory history = 4;
}

message Disks {
  optional int32 disk_num = 1;
  repeated Disk disk = 2;
}

当我运行代码时

  GetIdKeyValueResp resp;
  for (int i = 0; i < 10; i++) {
    IpInfo* ipinfo = resp.add_ips();
    cout << &(ipinfo->disks()) << endl;
  }

输出是:

0x6424880
0x6424880
0x6424880
0x6424880
0x6424880
0x6424880
0x6424880
0x6424880
0x6424880
0x6424880

显然他们共享了一个地址,所以当我修改其中一个ip的磁盘信息时,其他ip也会被修改。我想知道这是为什么以及如何解决。

【问题讨论】:

  • 您还没有添加磁盘,您已经创建了对默认空磁盘记录的引用。磁盘是在修改时创建的(写入时复制)。
  • 那我应该如何添加磁盘呢?

标签: c++ protobuf-c


【解决方案1】:

我使用 mutable_disks() 并且没问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多