diff options
author | Jisi Liu <jisi.liu@gmail.com> | 2016-09-23 11:17:00 -0700 |
---|---|---|
committer | Bo Yang <teboring@google.com> | 2016-10-10 11:44:21 -0700 |
commit | 4cf072248fc39d1c63dcb1600ff9e73df8757779 (patch) | |
tree | 0eff71b46678e988703a06e96d3a00681debd453 /src/google/protobuf/compiler | |
parent | f9f3c35eb36b208d99a85a21c05767dfd36f2968 (diff) |
Fix default instance destructor
Diffstat (limited to 'src/google/protobuf/compiler')
-rw-r--r-- | src/google/protobuf/compiler/cpp/cpp_message.cc | 15 | ||||
-rw-r--r-- | src/google/protobuf/compiler/plugin.pb.cc | 3 |
2 files changed, 18 insertions, 0 deletions
diff --git a/src/google/protobuf/compiler/cpp/cpp_message.cc b/src/google/protobuf/compiler/cpp/cpp_message.cc index f5648663..f3dd8067 100644 --- a/src/google/protobuf/compiler/cpp/cpp_message.cc +++ b/src/google/protobuf/compiler/cpp/cpp_message.cc @@ -1815,6 +1815,9 @@ GenerateDefaultInstanceInitializer(io::Printer* printer) { void MessageGenerator:: GenerateShutdownCode(io::Printer* printer) { + printer->Print( + "$classname$::default_instance_.Shutdown();\n", + "classname", classname_); if (HasDescriptorMethods(descriptor_->file(), options_)) { if (descriptor_->oneof_decl_count() > 0) { printer->Print( @@ -2151,6 +2154,7 @@ GenerateSharedDestructorCode(io::Printer* printer) { // TODO(kenton): If we make unset messages point at default instances // instead of NULL, then it would make sense to move this code into // MessageFieldGenerator::GenerateDestructorCode(). + bool need_delete_message_field = false; for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); @@ -2158,10 +2162,21 @@ GenerateSharedDestructorCode(io::Printer* printer) { field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { // Skip oneof members if (!field->containing_oneof()) { + if (!need_delete_message_field) { + need_delete_message_field = true; + printer->Print( + "if (this != &default_instance_.get()) {\n"); + printer->Indent(); + } printer->Print("delete $name$_;\n", "name", FieldName(field)); } } } + if (need_delete_message_field) { + printer->Outdent(); + printer->Print( + "}\n"); + } printer->Outdent(); printer->Print( diff --git a/src/google/protobuf/compiler/plugin.pb.cc b/src/google/protobuf/compiler/plugin.pb.cc index 1c19d46a..4fc7c432 100644 --- a/src/google/protobuf/compiler/plugin.pb.cc +++ b/src/google/protobuf/compiler/plugin.pb.cc @@ -114,8 +114,11 @@ void protobuf_RegisterTypes(const ::std::string&) { } // namespace void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto() { + CodeGeneratorRequest::default_instance_.Shutdown(); delete CodeGeneratorRequest_reflection_; + CodeGeneratorResponse::default_instance_.Shutdown(); delete CodeGeneratorResponse_reflection_; + CodeGeneratorResponse_File::default_instance_.Shutdown(); delete CodeGeneratorResponse_File_reflection_; } |