在析構函數中使用delete p,p前後指向的地址相同,而普通函數中用delete p,p前後指向的地址不同,代碼如下,望大佬賜教
#include &
using namespace std;
class Person {
public:
Person(int age, int height)
{
m_age = age;
m_height = new int(height);
}
~Person()
{
cout&
運行結果如下:
沒有意義,不要去費心費力研究它。
我對先前的惡意揣測深表歉意。經過更多的測試發現,似乎只有VS存在這個行為。並且這個行為並不屬於operator delete,而是直接插入delete語句處的,推測是VS為了方便及早發現涉及已釋放內存的bug而賦了一個無效值。
這個行為的觸發條件比較嚴格,傳右值(delete (int*)p;
) 、有副作用的操作(delete (p=p);
)、重新賦值會導致副作用(int* volatile p;
)、成員變數(delete m_height;
)都會阻止指針被修改。但將指針聲明為const並不能阻止,看起來編譯器比較任性()
關於成員變數為什麼不會被修改,我傾向於認為是為了保持對象的完整性,避免破壞設計時的某些約束;也可能是因為成員變數的定址方式比普通變數相對複雜,不值得為預防bug而付出運行時代價。