今天有朋友問我題的時候,出現了一個迷惑情況,就是同樣的代碼,在我這能跑,在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熱心網友回復:
先說一下,對是NULL的指標free,不會出錯。所以你的環境是否free(p)之后,把P改寫為null?
如果是這樣,不會出錯。
uj5u.com熱心網友回復:
無運行錯誤不代表程式沒問題,有一定概率的真實運行環境中有可能會導致其他地方崩潰,我以前遇到過,很難找
uj5u.com熱心網友回復:
感謝1樓的回復
剛剛去試了試 發現在free了之后并不為NULL...
uj5u.com熱心網友回復:
我這里確實是覺得程式是有問題的,是疑惑為什么沒有導致崩潰或者錯誤,這會是編譯器的問題嗎?
uj5u.com熱心網友回復:
跟編譯器無關,*((char*)rand()) = '1' 這句都不一定會引起崩潰。但可能會引起其他潛在的問題,因為修改了其他地方的記憶體uj5u.com熱心網友回復:
freeC 動態記憶體管理
定義于頭檔案 <stdlib.h>
void free( void* ptr );
解分配之前由 malloc() 、 calloc() 、 aligned_alloc (C11 起) 或 realloc() 分配的空間。
若 ptr 為空指標,則函式不進行操作。
若 ptr 的值不等于之前從 malloc() 、 calloc() 、 realloc() 或 aligned_alloc() (C11 起) 回傳的值,則行為未定義。
若 ptr 所指代的記憶體區域已經被解分配,則行為未定義,即是說已經以ptr 為引數呼叫 free() 或 realloc() ,而且沒有后繼的 malloc() 、 calloc() 或 realloc() 呼叫以 ptr 為結果。
若在 free() 回傳后通過指標 ptr 訪問記憶體,則行為未定義(除非另一個分配函式恰好回傳等于 ptr 的值)。
free 是執行緒安全的:它表現得如同只訪問通過其引數可見的記憶體區域,而非任何靜態存盤。
令 free 解分配記憶體區域的呼叫,同步于任何令分配函式分配相同或部分相同區域的后續呼叫。這種同步出現于任何解分配函式所做的記憶體訪問后,和任何分配函式所做的記憶體訪問前。所有操作每塊特定記憶體區域的分配及解分配函式擁有單獨全序。
uj5u.com熱心網友回復:
對一個指標重復free屬于標準未定義行為,具體看編譯器如何規定。uj5u.com熱心網友回復:
感謝!這應該確實是由于未定義各個編譯器處理不同造成的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59035.html
標籤:C++ 語言
