最近在研究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 <stdio.h>
#include <iostream>
using namespace std;
using namespace wanjun;
int main(){
Person *person = new Person();
delete person;
return 0;
}
为了追踪是否有内存泄露
我们修改了 wanjun.person.pb.cc 文件
在每次实例化和析构Person 类型时都会有打印出来
编译执行后的结果为
那么问题来了,为什么会多一个 person ++ ?是否有内存泄露呢?
答案便存在 wanjun.person.pb.cc 文件中
protoc 实现的 .cc 文件中对每一个 message 类型都有一个默认的static instance
那么是否会造成内存泄露呢?
static成员变量和普通static变量一样,都在内存分区的全局数据区分配内存,到程序结束后释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。