首页 > c++ delete 和 free的区别?

c++ delete 和 free的区别?

链表节点移除

    if (head->next) {
        while (workptr->next && (workptr->next->index != index)) {
            workptr = workptr->next;
        }

        if (workptr->next) {
            tempptr = workptr->next;
            workptr->next = tempptr->next;
            free(tempptr); //这里用delete就会出错
            tempptr = nullptr;
            --this->size;
        }
    }

貌似delete把后面的节点一起释放掉了?


看你使用的什么申请的空间啊,new的话用delete,malloc的用free,而且实际上malloc/free是c语言的用法,c++只是兼容。


http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free


其实应该是这样的
1) delete是关键字,而free是库函数,
C++关键字
http://baike.baidu.com/link?url=TJ8RZ7ac_liACKZkHnQt0LOWCtQS9Lxj6vnXKlycyrqZmGEpIaP9H0rO_2hbwxpYUw2G_ZjUShwPi742hShgAq
C的关键字是http://www.cnblogs.com/yezhenhan/archive/2011/10/16/2214420.html
注意,在C的关键字列表里没有free
2) 操作的对象不同, delete的操作对象是对象或者对象数组,而free是void *
3) C++的delete可以重载,也就数说,delete是对象方法,而一般没人重载free


delete会在释放之前调用析构。

对于POD来说,这两个函数行为相同,但是还是不提倡混着用。


new delete這一對是對象
free malloc這一對是內存


话说 delete与new 是一一对应的,tempptr是用什么方式申请的内存的啊?malloc吗?如果没有用new申请 自然不能用delete释放。


貌似delete把后面的节点一起释放掉了?

肯定不可能啊,这是链表,空间不连续,不可能会把后面的节点释放掉

delete是运算符,如果指针指向的是对象,编译器在编译的时候除了产生释放空间的指令以外,还会调用该对象的析构函数

所以,,会不会是析构函数的问题?


delete是会调用析构函数 再释放内存的,new和delete不一定强制成对 你可以malloc分配内存然后用placement new 在申请的内存上构造对象,让后也可以用delete删除他


好的习惯是成对使用

ps: 为什么我不很清楚,兄弟不要作死,先遵循这条信条,在慢慢搞明白原因

new     <-->  delete
new[]   <-->  delete[]
malloc  <-->  free

C++中的new/delete是新实现的内存分配器,而malloc和free是C标准库实现的另一套内存分配器,他们走的是不同的算法,所以当然不能混用了.

至于一些奇葩的C++编译器实现,可能用C标准库中的free和malloc来实现new/delete,那我们还是不能确定能不能混用,如果你用了好使,也别混用

总之他们就是两个不同的事物,你问张三借了钱,不能去李四哪里还啊

【热门文章】
【热门文章】