如何从C++ gRPC服务接口访问服务端类的成员变量
问题根因
你代码的核心问题是服务实例混淆:
- 你在
grpcServices::run方法开头修改的test_1、test_2、test_3,都属于调用run方法的当前grpcServices类实例的成员变量 - 但你在run方法内部又新建了一个局部的
bla::grpcServices service对象,你注册到gRPC服务端的是这个全新的局部实例,这个实例的成员变量完全没有经过你前面的初始化修改,对应你拿到的输出:test_1走默认构造是空vector,所以接口里输出size为0test_2是未初始化的野指针,访问时拿到的是内存垃圾值,对应你看到的超大无符号数,严重时会直接触发程序崩溃test_3走了类构造函数的默认初始化逻辑,所以接口里输出size为5,和你的输出完全吻合
修复方案
- 删除run方法中局部的
bla::grpcServices service实例声明,将注册服务的代码改为注册当前实例:
// 删掉这行 bla::grpcServices service; builder.RegisterService(this); // 注册当前实例,而不是新建的局部实例
- 额外优化建议:
- 去掉无意义的指针包装,
test_2直接声明为std::vector<double>即可,不需要用原始指针,避免内存泄漏和野指针问题 - 如果后续会有多个gRPC请求并发读写这些共享成员变量,需要加互斥锁保证线程安全,避免数据竞争
- 去掉无意义的指针包装,
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

