释放生成的 Protobuf class 会导致段错误
Freeing Protobuf generated class causes a a segment fault
您好,我正在将 Protobuf 用于我关于神经网络的个人项目。
这是我的 Protobuf 定义:
syntax = "proto3";
package NGNET;
message InputLayer {
string name = 1;
uint32 size = 2;
}
message ComputeLayer {
string name = 1;
uint32 size = 2;
repeated LayerLink inputs = 3;
}
message LayerLink {
InputLayer il_input = 1;
ComputeLayer cl_input = 2;
uint32 output_size = 3;
repeated float weights = 4;
}
message NNET {
string name = 1;
repeated ComputeLayer outputs = 3;
}
网络是这样创建的:
ComputeLayer output1 = ComputeLayer(10, "output1");
ComputeLayer output2 = ComputeLayer(10, "output2");
ComputeLayer hidden = ComputeLayer(100, "hidden");
InputLayer input1 = InputLayer(784, "input1");
InputLayer input2 = InputLayer(784, "input2");
output1.link(&hidden);
output2.link(&hidden);
hidden.link(&input1);
hidden.link(&input2);
hidden.link(&extra);
link 函数定义为:
void ComputeLayer::link(ComputeLayer* to_link) {
NGNET::LayerLink* link = new NGNET::LayerLink();
link->set_output_size(internal->size());
link->set_allocated_cl_input(to_link->getInternal());
internal->mutable_inputs()->AddAllocated(link);
}
void ComputeLayer::link(InputLayer* to_link) {
NGNET::LayerLink* link = new NGNET::LayerLink();
link->set_output_size(internal->size());
link->set_allocated_il_input(to_link->getInternal());
internal->mutable_inputs()->AddAllocated(link);
}
注:getInternal()
函数returns一个NGNET::ComputeLayer
或NGNET::InputLayer
然后将输出点赞到 NNET 中:
nnet->mutable_outputs()->AddAllocated(output1->getInternal());
nnet->mutable_outputs()->AddAllocated(output2->getInternal());
当 nnet
被删除时,程序因段错误而崩溃。
我相信这是因为隐藏层被删除了两次。有什么办法可以安全地释放分配的内存吗?
谢谢。
add_allocated_*()
和 set_allocated_*()
方法 获得给定指针的所有权。这意味着您必须确保以后没有其他代码会删除这些指针,因为 Protobuf 实现会在消息被销毁时删除它们。
如果您不希望 Protobuf 获得这些对象的所有权,您应该制作副本:
link->mutable_il_input()->CopyFrom(*to_link->getInternal());
nnet->mutable_outputs()->Add()->CopyFrom(*output2->getInternal());
通常,除非您正在做大量的内存分配优化,否则您可能永远不想调用 "allocated" protobuf 访问器。
您好,我正在将 Protobuf 用于我关于神经网络的个人项目。
这是我的 Protobuf 定义:
syntax = "proto3";
package NGNET;
message InputLayer {
string name = 1;
uint32 size = 2;
}
message ComputeLayer {
string name = 1;
uint32 size = 2;
repeated LayerLink inputs = 3;
}
message LayerLink {
InputLayer il_input = 1;
ComputeLayer cl_input = 2;
uint32 output_size = 3;
repeated float weights = 4;
}
message NNET {
string name = 1;
repeated ComputeLayer outputs = 3;
}
网络是这样创建的:
ComputeLayer output1 = ComputeLayer(10, "output1");
ComputeLayer output2 = ComputeLayer(10, "output2");
ComputeLayer hidden = ComputeLayer(100, "hidden");
InputLayer input1 = InputLayer(784, "input1");
InputLayer input2 = InputLayer(784, "input2");
output1.link(&hidden);
output2.link(&hidden);
hidden.link(&input1);
hidden.link(&input2);
hidden.link(&extra);
link 函数定义为:
void ComputeLayer::link(ComputeLayer* to_link) {
NGNET::LayerLink* link = new NGNET::LayerLink();
link->set_output_size(internal->size());
link->set_allocated_cl_input(to_link->getInternal());
internal->mutable_inputs()->AddAllocated(link);
}
void ComputeLayer::link(InputLayer* to_link) {
NGNET::LayerLink* link = new NGNET::LayerLink();
link->set_output_size(internal->size());
link->set_allocated_il_input(to_link->getInternal());
internal->mutable_inputs()->AddAllocated(link);
}
注:getInternal()
函数returns一个NGNET::ComputeLayer
或NGNET::InputLayer
然后将输出点赞到 NNET 中:
nnet->mutable_outputs()->AddAllocated(output1->getInternal());
nnet->mutable_outputs()->AddAllocated(output2->getInternal());
当 nnet
被删除时,程序因段错误而崩溃。
我相信这是因为隐藏层被删除了两次。有什么办法可以安全地释放分配的内存吗?
谢谢。
add_allocated_*()
和 set_allocated_*()
方法 获得给定指针的所有权。这意味着您必须确保以后没有其他代码会删除这些指针,因为 Protobuf 实现会在消息被销毁时删除它们。
如果您不希望 Protobuf 获得这些对象的所有权,您应该制作副本:
link->mutable_il_input()->CopyFrom(*to_link->getInternal());
nnet->mutable_outputs()->Add()->CopyFrom(*output2->getInternal());
通常,除非您正在做大量的内存分配优化,否则您可能永远不想调用 "allocated" protobuf 访问器。