#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
for(int i=1; i<1000; i++)
{
char *c = new char;
delete (double*)c;
} return 0;
}
这样会不会内存出错,结论是不会,最终确定
delete 的时候,不管重载成什么的时候,都是delete new时候的大小。

解决方案 »

  1.   

    你怎么知道不会的?如何验证的?
    #include <iostream>
    using namespace std;class Test{
    public:
    ~Test(){ cout << "~Test" << endl; }
    };int main(){ Test* p = new Test;
    delete (int*)p;
    cout << "main" << endl; return 0;
    };
      

  2.   

    手头没ISO C++手册,没统一规定的话就是编译器相关的.
      

  3.   

    new的返回类型和delete的参数都是void*,所以不管怎么转都没关系。
      

  4.   


    说的对。其实delete的时候不关心内存是什么样子的,不关心内存的长度,只知道把这块内存K掉。
      

  5.   

    不出错是因为double没有析构函数。
    下面这段代码,你试试出不出错:
    class ABCDEF
    {
    public:
        ~ABCDEF() {m_data[99] = 0;}
        double m_data[100];
    };int main(int argc, char* argv[])
    {
        char *c = new char;
        delete (ABCDEF*)c;
        return 0;
    }
      

  6.   

    void * ,什么类型都没关系。操作系统分配给你用的时候已经记录在案的,什么类型都跑不掉你。
      

  7.   

    我大概也有收获了啦:
    1.new 和 delete 是类型无关的。new时只要告诉大小多少字节,就得到了一片内存的指针,这个指针随便你怎样用都行,同时系统做了分配内存的记录
    delete时只要提供一个由new得到的指针,确保该指针在系统中有记录,就准确的删除了分配过的那片内存,
    2.指针转换类型,根据用户需要,编译器根据用户对指针的转换进行编译。如p++,如果p是int,就增加4字节,就是增加sizeof(int),所以指针转换成不同的类型得到不同的编译结果。delete 时加类型转换,删除内存的效果是一样的,不同之处在于:如果转换成某些类型,编译器会去执行它的析构函数,当然就可能出错了。因为编译器又不知道你在乱转换类型。
      

  8.   


    delete (double*)c; 根本不用理会强制转换的类型。指针归根到底就是一个内存地址,无论怎么转换还是原来的地址。