none
关于map里new结构体释放的一个问题 RRS feed

  • 问题

  • typedef struct __MAPFE
    {
        char x[10];
        char y[10];
        char z[10];
    } fmap,*pfmap;   声明结构体

    typedef map<int,fmap*> *N ;
        N n1;
        map<int,N> m1;
        int i = 0;
        n1 = new map<int,fmap*>();
        m1[i] = n1;
        fmap *f;
        f = new fmap;
        strcpy_s(f->x,sizeof(f->x)-1,"1");
        strcpy_s(f->y,sizeof(f->y)-1,"2");
        strcpy_s(f->z,sizeof(f->z)-1,"3");
        (*n1)[1] = f;
        map<int,fmap*>::iterator it = m1.begin()->second->begin();
        //free(it->second);
        delete it->second;这段代码是我将一个高手的代码精简后的,问题是他用的是free来释放这个结构体的内存空间。我用这个调试的时候发现delete和free都一样能释放掉空间。但是我想知道这个地方到底该用哪一个。从我现在的能力出发肯定是考虑delete。因为他对应new.最好能告诉我这个delete和new 在这既然都能释放空间,那么他两的区别在哪里,如果我用free会造成什么样的影响,用delete又会怎样。谢谢各位的指导。

    2011年10月14日 8:01

答案

  • free直接从堆上释放空间。delete在释放之前首先调用析构函数。但是由于你这里是一个具有bitwise语义的结构体。不需要调用析构函数。所以free和delete没有区别。
    麻烦把正确答案设为解答。
    2011年10月14日 9:00
    版主
  • 具有bitwise语义代表该对象不需要调用任何构造函数,只需要通过为其分配内存来创建对象。

    具体给你推荐一本叫深入探索C++对象模型的书。


    麻烦把正确答案设为解答。
    2011年10月16日 8:02
    版主

全部回复

  • free直接从堆上释放空间。delete在释放之前首先调用析构函数。但是由于你这里是一个具有bitwise语义的结构体。不需要调用析构函数。所以free和delete没有区别。
    麻烦把正确答案设为解答。
    2011年10月14日 9:00
    版主
  • bitwise语义的结构体,刚百度了一下这个语义。但不是很明白,看到一个人提到了深拷贝和浅拷贝的概念。能和学生概括性的说下这个含义吗
    2011年10月14日 9:28
  • 具有bitwise语义代表该对象不需要调用任何构造函数,只需要通过为其分配内存来创建对象。

    具体给你推荐一本叫深入探索C++对象模型的书。


    麻烦把正确答案设为解答。
    2011年10月16日 8:02
    版主