链表节点移除
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_liACKZkHnQt0WCDQS9Lxj6pdpwiwpdpwpwpwpwwdpwpwpwp**pw*p; jUShwPi742hShgAq
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
http://stackoverflow.com/questions/240212/what-is-the-difference-Between-new-delete-and-malloc-free