protobuf 中 message默认的静态实例

最近在研究protobuf ,运行官网给的实例的时候发现了一个有趣的事情。
以下是代码

// wanjun.person.proto
syntax="proto3";
package wanjun;

// proto3 移除了 required
message Person{
    string name = 1;
    int32 age = 2;
};

// dont forget the ;
message Family{
    repeated Person person = 1;
};

命令行执行

protoc --cpp_out=. wanjun.person.proto

我们的测试代码为

#include "wanjun.person.pb.h"
#include 
#include 
using namespace std;
using namespace wanjun;

int main(){
    Person *person = new Person();
    delete person;
    return 0;
}

为了追踪是否有内存泄露
我们修改了 wanjun.person.pb.cc 文件
protobuf 中 message默认的静态实例_第1张图片
protobuf 中 message默认的静态实例_第2张图片
在每次实例化和析构Person 类型时都会有打印出来
编译执行后的结果为

protobuf 中 message默认的静态实例_第3张图片
那么问题来了,为什么会多一个 person ++ ?是否有内存泄露呢?
答案便存在 wanjun.person.pb.cc 文件中
protobuf 中 message默认的静态实例_第4张图片
protoc 实现的 .cc 文件中对每一个 message 类型都有一个默认的static instance
那么是否会造成内存泄露呢?
static成员变量和普通static变量一样,都在内存分区的全局数据区分配内存,到程序结束后释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。

你可能感兴趣的:(C++)