我在C ++中重载了一个删除操作符,我使用了free()
:
class A
{
private:
int x;
int y;
public:
void operator delete(void* ptr)
{
free(ptr);
}
void operator delete[](void* ptr)
{
free(ptr);
}
}
int main()
{
A *a = new A();
A *b = new A[10];
delete a; // This should free 8 bytes
delete b; // This also 8 only
delete[] b;// This should free 80 bytes
return 0;
}
这项工作有多自由
正如我所知,动态分配存储分配为隐藏的大小,因此在释放时它会从那里使用
但是,当我们使用delete b;
或delete[] b;
隐藏分配时,alwyas 80则说明8只能取消分配。
如果它的方法不正确那么我们如何使用free来重载删除操作符?
答案 0 :(得分:3)
将delete array
与使用new T[n]
(对于某些类型T
和某些类型n
)获得的指针一起使用会导致未定义的行为。
答案 1 :(得分:0)
delete b
也知道按照您所期望的delete[] b
在delete b
位置使用delete [] b
可能会导致未定义的行为。您错过的方面是,如果您不使用delete [],则不会调用数组中各个对象的析构函数。
请在此处搜索StackOverflow。
,而不是在此处重复(很多)早期答案答案 2 :(得分:0)
new
和delete
是一对紧密耦合的操作。仅重载其中一个是不正确的,因为它们是相同对象分配方案的两半。
默认的new和delete实现在标准中未指定,因此是实现定义的。
可能是默认新用malloc()
在您的系统上分配内存,但它可能不是。