我不知道这是不是正确的标题,但是有人可以向我解释为什么会这样吗?
class InitializeFormSerializer(serializers.Serializer):
title = serializers.CharField()
category = serializers.ChoiceField(choices=CATEGORY_TYPES)
def create(self, validated_data, user):
children_types = {
'FIRST_TYPE': Child1,
'SECOND_TYPE': Child2,
}
identifier = validated_data.get('title')
obj, created = Parent.objects.update_or_create(
user=user,
)
if created:
item_type = validated_data.get('item_type')
children_types[item_type].objects.create(identifier=obj)
return obj
我收到此错误:class asd {
public:
asd() {
const char* bufferX = new char[16];
const char* bufferY = new char[16];
const char Player = 'O';
}
~asd() {
delete[] bufferX;
delete[] bufferY;
}
};
答案 0 :(得分:3)
因为指针(bufferX
,bufferY
)是asd
构造函数的本地指针。这意味着它们在析构函数内或构造函数外的任何位置都不可见。
如果必须使用原始指针,则可能要使指针成为类成员。但是在C ++中使用原始指针通常不是一个好主意。考虑使用std::vector
或std::array
。
如果必须使用char[]
,请考虑使用C ++ 14智能指针,例如std::unique_ptr<char[]>
。然后,您不必担心调用delete。不再有任何引用后,该内存将自动释放。
示例:
std::unique_ptr<char[]> bufferX(new char[16]);
然后我们asd
被销毁,此内存将自动释放。
答案 1 :(得分:1)
您的bufferX和bufferY变量未声明为类成员,而是在asd()函数/构造函数中声明为变量,并且在该函数退出时被删除。
如果要保留它们,则应将它们声明为班级成员。
另外,请不要将代码作为图像发布,这会更难于帮助您。
class asd
{
public:
const char *bufferX, *bufferY;
const char Player = '0';
asd()
{
bufferX= new char[16];
bufferY= new char[16];
}
~asd()
{
delete[] bufferX;
delete[] bufferY;
}
};