今天有朋友問我題的時候,出現了一個迷惑情況,就是同樣的代碼,在我這能跑,在ta那就會崩。
之后發現是淺拷貝的相關問題,出問題的相關代碼如下:
#include <iostream>
struct Node{
int data;
struct Node *next;
};
int main() {
Node * p = new Node;
Node *q = new Node ;
q = p;
free(p);
free(q);
return 0;
}
q=p應該是淺拷貝,即q與p指向的是同一塊記憶體。
如果free(p)再執行free(q),因為q的記憶體已經被free了再free按理來說應該會報錯。
而在朋友的電腦上執行確實會報錯,在我這里就是正常結束(無error,return 0)??
求問大佬這可能是什么原因呢?
uj5u.com熱心網友回復:
double free如果是在debug版模式下,一般會崩潰,因為debug版在記憶體分配的時候會附加一些資訊,但是在release版,則不一定會崩潰,跟有些編譯器的處理方式可能也有關系,所以release版本的錯誤有時候很難找,而且不能穩定重現uj5u.com熱心網友回復:
這跟淺拷貝深拷貝沒關系吧,是對同一塊記憶體釋放了兩次可以參考以下帖子,看看free的原始碼
https://www.cnblogs.com/hanyonglu/archive/2011/04/28/2031271.html
申請記憶體時是附帶另外的記憶體管理資訊記憶體空間的,釋放時管理資訊記憶體空間也一起修改釋放了,再釋放就會再次修改這塊管理資訊記憶體空間(這塊空間第一次釋放就已經屬于垃圾記憶體了,所以修改它可能會造成沖突)
另外,你的申請釋放記憶體的函式也不規范,new對delete,malloc對free,竄著使用也會帶來問題
uj5u.com熱心網友回復:
首先你的代碼在VS2015 C++環境下是報錯的;其次,就像樓上朋友說的,new一定要對應delete,改成delete依舊報錯,原因就是q和p指向同一塊記憶體。
uj5u.com熱心網友回復:
https://bbs.csdn.net/topics/396632127轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59050.html
標籤:新手樂園
上一篇:哪錯了
