以下只是記錄一下我將工程從evc+wince5.0 移植到vs2005+wince6.0上的一點解惑。
template class auto_ptr
auto_ptr(auto_ptr& a) : m_ptr(a.release()) {}
auto_ptr& operator=(auto_ptr& a)
return *this;
}auto_ptr& operator=(t *p)
return *this;
}~auto_ptr()
t& operator*() const
t* operator->() const
operator t*() //add
operator const t*() const //add
t* get() const
t* release()
void reset(t* p = 0)
};這是個智慧型指標類auto_ptr,但這個智慧型指標所建立的臨時指標物件作為乙個函式的引數,分別在evc和vs2005
編譯執行產生了不同的行為。
例如:rfile * fp = new rfile();
m_fp=new cbuffile(auto_ptr(fp));
這個cbuffile的建構函式:
cbuffile::cbuffile(auto_ptrfile) :
m_fp(file),
m_ptr(0)
1.evc編譯 在wince5.0上執行
auto_ptr(fp)是乙個臨時建立的物件a,
在cbufile的建構函式裡執行auto_ptr的拷貝建構函式,
auto_ptr& operator=(auto_ptr& a)
從而將a的指標傳遞給拷貝者m_fp,a自己release符合使用auto_ptr的原則
(使用auto_ptr的乙個重要原則:乙個原生指標只能被auto_ptr物件封裝一次,不然可能就會產生「野指標」出現violate access)
2. vs2005 +wince 6.0
auto_ptr(fp)是乙個臨時建立的物件.在cbufie的建構函式裡也執行一次拷貝構造,但是被拷貝者不是a,而是取出的
a所封裝的指標所構造出的物件b,而b的指標確實以拷貝構造的方式將自己的指標傳遞給了cbufile裡的m_fp,但這裡缺
違反了上述原則,沒有把a release,留下了產生野指標的後患。因為 a與cbufile裡的m_fp 封裝了相同的指標,其中乙個的
生存期完後,就到導致另乙個在被使用時產生violate access.
所以使用auto_ptr建立乙個智慧型指標臨時物件作為函式引數是乙個很危險的事(用上述的auto_ptr)..
總結如下:
1.vs2005--- 智慧型指標構造的臨時物件,不能作為引數使用(使用要小心)
2.開啟檔案失敗,而檔案控制代碼不為空,,說明此時控制代碼已經被closehandle了,不再是有效的控制代碼.
3.no source load for dll,,...dll除錯中,沒有可以執行的**了,會出現以上的說明。
4.nrefs > 1..出現以上的錯誤提示,說明了控制代碼沒有關閉,導致核心物件引用計數》1..
5.vs2005 除錯中,,執行到某一行**就不能往下繼續執行了,下面行的**沒有被執行,,
說明這一行**出現了問題(但是偵錯程式可能沒有給出提示),一般的原因是非法訪問,如訪問乙個
空指標物件的成員(即指標本身為空,卻呼叫其成員函式,出現voliate access)
VS2005建立智慧型裝置DLL
1 檔案 新建 其他語言 visual c 智慧型裝置 win32智慧型裝置專案 2 輸入名稱dll 3 平台 選中要支援的智慧型裝置sdk,這裡選擇wm5 wm6 4 應用程式型別 選擇dll專案 5 新建.h和.cpp檔案 如下 h ifndef dll test h define dll te...
vs2005斷點失效的問題,
不知道從什麼時候開始,vs2005 不能設定斷點了,啟動除錯的時候,連停止,和重啟除錯選單都沒有,這個折磨我好久了,vs2005有的時候可以設定斷點,有時候又不能用,寫 的時候真的是折騰人,在網上搜尋了下,基本上都是一樣的,要麼就是源 不一樣,還有設定專案屬性c 什麼的,我的專案屬性都找不到c 的,...
安裝vs2005遇到的問題
以前使用的vs2003,在接觸vs2005後,馬上就喜歡上了它,雖然是個英文版的,我也想著去用。我常用的工作電腦乙個是家裡的,乙個是單位的。家裡的電腦是xp sp2,單位的電腦是win2003 sp1,在單位的電腦上安裝,一路通行,順利而過。只是由於我在單位的電腦是乙個伺服器,慢的要死,在辦公室裡的...