`

c++ - delete(void *, size_t) or delete(void *)

    博客分类:
  • c++
c++ 
阅读更多

In my previous dicuss, we have seen the example of overloaded delete and new operator. and as a matter of fact, we have seen the following signature of the delete operator. 

 

 

void operator delete(void *);
void operator delete(void *, size_t size);

 

 

As you will soon find out that they both match the same new operator

 

void operator new (size_t);

 

but which one should we  choose to use?

 

and even, you can define both the operator delete(void *) and the operator delete (void *, size_t) in the same class, and according to my test , in the placement operator overloading example, the "operator delete(void *)" has precedance over the "operator delete (void *, size_t)"....

 

so here is my rule of thme, we uses operator delete (void *, size_t size) when 

 

  • the size_t is not barely the size of the object (this could happen if the new operator has say, preallocate some space which is larger than what is required by the object itself.)
  • the size_t is necessary to determine flows or it is necessary in the clean up that the delete operator is supposed to do.
  • Booking and logging requirement.
  • This can be thought as an extension to the point 2, where you can normally see allocated memory is larger than the object itself, is when you allocate a array (new [] operator actually does this)....

 

And when to use the operator delete (void *)?

 

  • when the size of the pointer in the first parameter is exact the size of the object
  • The size_t size is irrelevant in the deallocation flow. 

 

 

 

 

 

分享到:
评论

相关推荐

    JasonAPI接口封装数据的生成和解析

    - `void cJSON_Delete(cJSON *item)`:销毁一个JSON对象及其所有子项。 2. **JSON数据的生成** - `cJSON *cJSON_CreateObject(void)`:创建一个新的空对象。 - `cJSON *cJSON_CreateString(const char *string)`...

    解决error LNK2005 void __cdecl operator delete(void

    标题中的“error LNK2005 void __cdecl operator delete(void)”是一个常见的链接错误,它在C++编程中出现,通常涉及到多库编译时的符号重定义问题。这个错误表明在链接阶段发现了一个重复定义的`operator delete`...

    c++内存的动态申请与释放.pdf

    void* malloc(size_t size); void free(void* memblock); ``` - **申请内存**:`malloc` 函数接收一个参数 `size`,表示需要分配的内存大小(以字节为单位)。返回值是一个指向所分配内存起始地址的指针,其...

    C++Primer+浓缩.pdf

    - C++支持多种转义序列,用于在字符串中插入特殊字符,如`\n`(换行)、`\t`(水平制表符)等。 #### 八、变量与文字常量的存储区 - **变量**:既可作为右值(读取),也可作为左值(赋值)。 - **文字常量**:仅可...

    C++基础关键字介绍.docx

    - **void**:表示函数不返回任何值或表示指针为通用指针类型。 - **class**, **struct**:用于定义类或结构体。在 C++中,`class` 和 `struct` 几乎相同,但默认的成员访问权限不同(`class` 默认为私有,`struct` ...

    SQLite的C++接口

    ### SQLite的C++接口 #### 一、准备工作 在开始使用SQLite之前,我们需要做一些准备工作确保环境正确设置: 1. **支持C++编译**: 确保开发环境支持C++编译器,以便能够顺利地编译和运行C++代码。 2. **支持...

    linux多线程编程指南

    - **线程函数原型**:通常采用`void* thread_func(void *arg)`的形式。 - **创建缺省线程:** - 使用`pthread_create()`函数创建新线程,可以指定线程属性或者使用默认属性。 - 示例代码: ```c pthread_t ...

    VisualC++(VC++)编程序软件语言关键字大全集合参考.pdf

    在Visual C++(VC++)编程环境中,关键字是语言的核心组成部分,它们具有特殊的含义并指导编译器如何处理代码。以下是一些重要的VC++关键字及其详细解释: 1. **abstract**:关键字`abstract`用于定义接口类或者...

    高效率C++/C

    ### 高效率C++/C 编程指南关键知识点概览 #### 一、文件结构与组织 **1.1 版权和版本声明** - **重要性**:明确软件的版权归属,保护开发者权益。 - **实践建议**:在每个源文件的头部添加版权和版本声明,通常...

    [C++语言入门经典(第3版)]7-302-12062-5y_C++_

    如`template<typename T> void swap(T& a, T& b) {...}`,这个函数可以交换任意类型的变量。 10. **异常处理**:C++通过try、catch和throw关键字进行异常处理,允许程序在遇到错误时优雅地恢复执行。 11. **STL...

    C编码指南

    - **示例**:`const int MAX_SIZE = 100;` **5.4 类中的常量** - **作用域**:类中的静态常量具有全局可见性。 - **示例**: - `class MyClass {` - `public:` - `static const int MAX_COUNT = 100;` - `};` ...

    Dynamic-reading-array.zip_array_reading_数组 C++

    在C++编程中,动态读取数组是一种常见的内存管理技术,尤其在处理不确定大小的数据集时非常有用。本文将深入探讨动态读取数组的概念、实现方法,并以C++为例,介绍如何实现数组大小的自动增长。 动态数组不同于静态...

    C++操作符优先级表

    void* pVoid = reinterpret_cast<void*>(0x1234); ``` - **是否可重载**: 不可重载。 - **结合性**: 无。 ##### 12. **常量类型转换操作符** `const_cast` - **描述**: 去除或添加变量的`const`或`volatile`属性...

    c++常用术语英汉互译

    - **void**(空类型):表示没有任何类型。 - **volatile**(易变):用于标记那些可能被意外修改的变量。 - **wchar_t**(宽字符型):用于存储宽字符。 ### 2. Windows 错误代码 文件中还包含了一系列Windows...

    通立面试 题 通立科技

    void *my_memmove(void *dest, const void *src, size_t n) { if (dest >= src) { // Copy in reverse direction to avoid overwriting data. char *d = (char*)dest + n - 1; const char *s = (const char*)...

    实验一 C++简单程序设计 基础实验

    实验一 C++简单程序设计基础实验 本实验旨在让学生学会编写简单的 C++ 程序,复习基本数据类型变量和常量的应用,运算符与表达式的应用,结构化程序设计基本控制结构的运用,自定义数据类型的应用,简单的输入输出...

    C++中一些容易混淆的知识

    ### C++中一些容易混淆的知识 #### Q1. 在函数中,函数为void,此时加return有什么作用?Exit(0)和Exit(1)是什么作用? - **Return**:在`void`类型的函数中添加`return`语句实际上并不会返回任何值。然而,它的...

Global site tag (gtag.js) - Google Analytics