c++ 正在删除< template>对象,错误:为“delete”提供了类型“class Circular_Buffer〈unsigned int>”参数,应为指针

u0sqgete  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(164)

我在为微芯片富士野优化这个代码。
原始代码:https://gist.github.com/edwintcloud/d547a4f9ccaf7245b06f0e8782acefaa

delete cb; // error: type ‘class Circular_Buffer<unsigned int>’ argument given to ‘delete’, expected pointer

我试了很多方法,但都无济于事。

printf("deleting buffer\n");
        for(uint32_t i = 0; i < max_size; i++)
            {
                //printf("deleting item %hhd\n", i);
                //printf("deleting item\n");
                delete (T*)buffer[i];//delete the A object allocations. // <-----
            }

返回警告:从不同大小的整数强制转换为指针[-Wint-to-pointer-cast]
巫婆我以为已经找到了一个解决方案在这里,虽然它使我能够编译:Error while deleting a vector pointer to pointers
一个二个一个一个

kgsdhlau

kgsdhlau1#

您提供的代码存在四个问题:
1.您正在分配一个整数块,并试图将其视为指针数组。
1.显式调用类的析构函数。
1.然后调用delete,它也将调用类的析构函数。
1.您正在使用已删除的指针。
当你用uint32_t类型示例化你的类时,你是在指示代码创建一个指针,指向一个连续的内存空间,这个内存空间应该包含uint32_t类型的元素。这些不是指针。根据示例代码,您不希望它们成为指针,因为您不想将指针排队。因为它们不是指针你不需要循环删除它们。即使它们是指针,你也会释放它们所指向的内存,而不是包含地址的内存。当删除一个用new []创建的对象时,你需要调用delete[]。正如AndyCoffin在下面的评论中提到的,你不应该设置这缓冲区到NULL之前删除它.
不要直接调用析构函数。除非您正在使用placement new将项“放置”到托管内存空间中,而默认的delete功能会导致问题,否则永远不要直接调用析构函数。delete方法将为您调用它。
在错误地调用析构函数之后调用delete会导致不好的结果。双删除不是你的朋友。此外,你不能在不是指针的变量上调用delete。你没有动态分配Circular_Buffer对象,所以delete是不合适的。
最后,如果您使用了指针来创建循环缓冲区对象,那么在删除之后您将尝试访问它。
您可以考虑的另一个选项如下:

template <class T, int S> class X {
    T buffer[S]; 
};

无需分配。

相关问题