Maison > Questions et réponses > le corps du texte
链表节点移除
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把后面的节点一起释放掉了?
高洛峰2017-04-17 13:26:10
好的习惯是成对使用
ps: 为什么我不很清楚,兄弟不要作死,先遵循这条信条,在慢慢搞明白原因
new <--> delete
new[] <--> delete[]
malloc <--> free
C++中的new/delete是新实现的内存分配
器,而malloc和free是C标准库实现的另一套内存分配
器,他们走的是不同的算法,所以当然不能混用了.
至于一些奇葩的C++编译器实现,可能用C标准库中的free和malloc来实现new/delete,那我们还是不能确定能不能混用,如果你用了好使,也别混用
总之他们就是两个不同的事物,你问张三借了钱,不能去李四哪里还啊
黄舟2017-04-17 13:26:10
其实应该是这样的
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
PHPz2017-04-17 13:26:10
话说 delete与new 是一一对应的,tempptr是用什么方式申请的内存的啊?malloc吗?如果没有用new申请 自然不能用delete释放。
PHP中文网2017-04-17 13:26:10
貌似delete把后面的节点一起释放掉了?
肯定不可能啊,这是链表,空间不连续,不可能会把后面的节点释放掉
delete是运算符,如果指针指向的是对象,编译器在编译的时候除了产生释放空间的指令以外,还会调用该对象的析构函数
所以,,会不会是析构函数的问题?
天蓬老师2017-04-17 13:26:10
delete是会调用析构函数 再释放内存的,new和delete不一定强制成对 你可以malloc分配内存然后用placement new 在申请的内存上构造对象,让后也可以用delete删除他
巴扎黑2017-04-17 13:26:10
看你使用的什么申请的空间啊,new的话用delete,malloc的用free,而且实际上malloc/free是c语言的用法,c++只是兼容。
迷茫2017-04-17 13:26:10
http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free