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