delete,delete[],delete void*

本文探讨了C++中delete与delete[]操作符的区别,特别是对于类实例数组的处理方式。通过具体示例说明了当使用delete而非delete[]时可能导致的问题,即析构函数未被调用从而引发内存泄漏。

renren6250(刀客)   的说法是比较全面的.  
  对于简单数据类型int,char等的数组使用delete   还是   delete[]是完全一样的,对于类的实例的数组必须使用delete[];  

 

用了这么久的C++,才发现C++是目前所有的编成语言中最为复杂的一种,C++之路,   艰难.....

   
            delete void *

           这一操作对于一些简单的系统内建类型不会有问题,但如果void*所指向的对象在析构函数里要释放,进行此造作会丢失内存,因为它不执行析构函数,例如:                               
                                    
class CEntity
{
public:
    CEntity(char flag);
    ~CEntity();
private:
    void * m_data;
   char   m_flag;
};

CEntity::CEntity(char flag)
{
   m_flag = flag;
    cout<<"constructing entity "<<m_flag<<endl;
    m_data = new char[100]; 
}

CEntity::~CEntity()
{
    cout<<"destructing entity "<<m_flag<<endl;
    delete[] m_data;
}

以上这个类是没什么问题的,但是看以下的调用:
int main(int argc, char* argv[])
{
       CEntity * a = new CEntity('a');
       delete a;

       void * b = new CEntity('b');
       delete b;
 
       return 0;
}

其输出为: constructing entity a
                       destructing entity a
                       constructing entity b                                    
可见,delete b 的时候没有释放m_data所指向的内存,没有执行析构函数。

网上收集的,也不知道对不对,呵呵,多多评论一下,出错了不管

转载于:https://www.cnblogs.com/dongzhiquan/archive/2009/07/15/1994799.html

<think>好的,我现在需要解决用户关于C++中是否支持对void*类型使用delete操作符的问题。首先,我得回忆一下C++的内存管理机制,特别是delete操作符的使用规则。用户提到的void*指针,这种类型在C++中属于通用指针,可以指向任何数据类型,但同时也丢失了类型信息。 根据引用[4],当使用void*指针进行delete操作时,特别是数组形式的delete[],会出现问题。因为编译器需要知道指针指向的对象类型来正确调用析构函数,而void*没有类型信息,所以直接delete可能会导致未定义行为。例如,如果原指针指向的是一个带有析构函数的类对象数组,编译器无法正确调用每个元素的析构函数,导致资源泄漏或其他问题。 接下来,我需要确认C++标准中的相关规定。根据C++标准,删除void*指针是未定义行为,因为无法确定对象的类型,进而无法正确销毁对象。即使指针指向的是基本类型(如int或char),使用deletedelete[] void*也是不安全的,因为编译器可能无法正确匹配内存分配的大小,尤其是在不同的编译器实现中,内存分配方式可能有差异。 此外,用户提供的代码示例中,使用void* data = new char[100];然后delete[] data;这里的问题在于,虽然data实际指向的是char数组,但用void*类型删除时,编译器无法知道这一点,导致未正确释放内存。正确的做法应该是将void*转换回原始类型后再删除,例如:char* data = new char[100]; delete[] data;。 另外,引用[3]提到,函数如果没有返回值必须声明为void,这提醒我们在处理指针时也要明确类型,避免歧义。同样,引用[1]中的示例显示,void*指针在未初始化时可能有特定的默认值,但删除时的类型处理才是关键。 总结起来,C++不支持直接对void*使用deletedelete[],因为类型信息丢失,导致无法正确释放内存和调用析构函数。必须先将void*转换回原始类型指针,再进行删除操作,以确保安全和正确性。</think>在C++中,**不支持直接对`void*`类型使用`delete`或`delete[]`操作符**。这是由以下核心原因决定的: --- ### 一、语法行为与底层机制 1. **类型信息缺失** `void*`是通用指针类型,存储地址但丢失了具体类型信息。`delete`操作需要根据指针类型完成两件事: - 调用对象的析构函数(如果有) - 释放内存时确定内存块大小 由于`void*`无法提供类型信息,编译器无法正确执行这些操作[^4]。 2. **未定义行为风险** 对`void*`直接使用`delete`或`delete[]`属于**未定义行为(UB)**。例如: ```cpp void* p = new int(5); delete p; // UB:可能内存泄漏或程序崩溃 ``` 即使实际指向基本类型(如`int`、`char`),也无法保证安全释放。 --- ### 二、实验验证与代码示例 通过对比实验可直观看出差异: ```cpp // 正确示例 int* p1 = new int(10); delete p1; // 安全:类型明确,释放内存并调用析构函数(此处无) // 错误示例 void* p2 = new int(10); delete p2; // 编译通过,但运行时行为未定义 ``` 编译器可能不会报错,但实际执行时无法保证内存正确释放[^1][^4]。 --- ### 三、特例与解决方案 1. **强制类型转换** 必须将`void*`还原为原始类型指针后再删除: ```cpp void* p = new std::string("test"); delete static_cast<std::string*>(p); // 正确:调用析构函数并释放内存 ``` 2. **智能指针替代方案** 使用`std::unique_ptr`或`std::shared_ptr`可自动管理资源,避免手动`delete`: ```cpp auto p = std::make_unique<std::string>("test"); // 自动释放,无需手动操作 ``` --- ### 四、引用标准与规范 根据C++标准(ISO/IEC 14882): - **第5.3.5节**:`delete`的操作数必须是指向完整对象类型的指针。 - **第12.4节**:析构函数调用依赖于对象的动态类型。 因此,直接删除`void*`违反语言规范[^3][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值