C++ 中的重载删除运算符
Overload delete operator in c++
我在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;
隐藏分配时,总是说 80 然后 8 只被取消分配。
如果它的方式不正确,那么我们如何使用 free 重载删除运算符?
将 delete array
与指针一起使用,该指针与 new T[n]
一起使用(对于某些类型 T
和某些类型 n
(会导致未定义的行为。
delete b
也知道按照您期望从delete[] b
分配的大小
在delete [] b
的位置使用delete b
可能会导致未定义的行为。您错过的方面是,如果不使用 delete[],将不会调用数组中单个对象的析构函数。
不要在这里重复(许多(先前的答案,请在StackOverflow上搜索。
这是一个:删除与删除[]运算符在C++
new
和delete
是一对紧密耦合的操作。只重载其中一个是不正确的,因为它们是同一对象分配方案的两半。
默认的新建和删除实现在标准中未指定,因此实现是定义的。
可能是默认的新用途malloc()
在系统上分配内存,但可能不是。
相关文章:
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 无效删除运算符语法
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- C++自定义删除运算符不能正常工作?
- 为什么我们甚至需要删除运算符?(我们不能只使用删除[]吗)
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 在这里使用删除运算符是否正确,我很困惑
- 删除运算符
- 使用空实现重写删除运算符
- C ++(为什么)确实移动构造函数删除运算符=
- 如何在 C++ 中使用删除运算符删除单个数据
- 如何通过带有指向基类的指针的删除运算符释放内存
- 删除运算符如何在我的代码中工作
- C++ - 定义自定义新建和删除运算符时make_shared
- 将删除运算符放置在何处以进行动态变量
- C++删除运算符而不"new"
- 如何使用删除 [] 运算符清除动态分配的内存?(无法使用常规删除语法清除)
- 为什么删除运算符在const上下文中使用
- c++是否需要在用户定义和类特定的删除运算符中处理nullptr
- C++ 在覆盖新运算符和删除运算符时不释放数据