为什么用'new'关键字声明数组指针时无法删除数组指针

时间:2019-01-27 01:04:58

标签: c++

我不知道这是不是正确的标题,但是有人可以向我解释为什么会这样吗?

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; } };

2 个答案:

答案 0 :(得分:3)

因为指针(bufferXbufferY)是asd构造函数的本地指针。这意味着它们在析构函数内或构造函数外的任何位置都不可见。

如果必须使用原始指针,则可能要使指针成为类成员。但是在C ++中使用原始指针通常不是一个好主意。考虑使用std::vectorstd::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;
    }
};