C++編譯常見錯誤


error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

 

我像往常一樣加了#define  _CRT_SECURE_NO_WARNINGS,不知為啥,這次這樣做不管用了。

這次使用這樣的方法:解決方案,項目 ->屬性 -> c/c++ -> 預處理器 -> 點擊預處理器定義,編輯,加入_CRT_SECURE_NO_WARNINGS,問題解決。

 

 

1.編譯我的工程時候,出現
fatal error C1010: unexpected end of file while looking for precompiled header directive


解決方法:
在文件開頭添加:
#include "stdafx.h"


2.'CDataStream::GetBytes' : illegal call of non-static member function


原因:
CDataStream::GetBytes靜態成員函數才可以這樣調用,這是由於不小心所致。


3.VC++中,提示cannot add new member的解決方法
當我們為對話框上的控件添加事件響應函數時,出現cannot add new member 這樣的提示信息。


解決方法:
將所有自動生成的文件Clean掉,關閉工程,重新啟動,並Build All




4.LNK2001:unresolved external symbol “symbol”


一般來說,發生錯誤的原因有兩個:
(1)所引用的函數、變量不存在、拼寫不正確或者使用錯誤;
(2)可能使用了不同版本的鏈接庫。


我遇到的情況有以下幾種:
(1)所使用的函數名拼寫錯誤
(2)所使用的函數的參數與自己編譯並使用的lib庫不一致。


5.Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)


問題產生原因:
1.內存泄漏;所以當程序退出時,系統會收回分配的內存,於是調析構函數,由於內存已被錯誤地釋放,於是就會出現“Debug Assertion Failed”的錯誤。

2.這個assert說明什么問題呢?說明有一塊內存在被釋放的時候,它的頭部里面的信息已經被改掉了,和預期的不一樣。內存分配的程序往往在被分配出的內存塊頭部放上一些校驗信息。這個信息內存的用戶是不知道也不應該修改的。這樣,在內存被釋放的時候,內存分配程序就可以驗對這個頭部信息是否被改過了。若被改過,就說明發生了內存corruption.

這種corruption有兩種可能性:
1)有人在內存越界寫東西;
2)這塊內存已經被釋放了,又被重復釋放了一次。(在第一次被釋放中,是內存分配程序改掉了頭部


信息)。
3.pHead_>nBlockUse就可能是空指針,或它指向的東西已經不存在了。
解決辦法:
一般來說,這個問題產生的原因大部分是第二種情況,而corruption也最可能是第二種情況,即重


復釋放內存。對於D3DX程序來說,如果是用的D3DX的API接口創建的指針,則在Release之后不需要也不能


再調用delete來釋放內存,因為Release本來就已經釋放了內存,再次調用delete就會造成重復釋放內存


,也就是本文所描述的那個問題。那么對應的解決辦法就是刪掉Release后面所對應的delete語句就OK了


。(注意,D3DX的API創建的指針只需要Release就OK,如果是自己創建的新的class,那么最好加上delete


語句來釋放內存。)


我的情況是使用了兩次delete [] m_pData(m_pData是我的類中定義的一個私有數據成員)
在new的后面使用了一次,在析構函數中使用了一次。


6.Expression:_CrtIsValidHeapPointer(pUserData)
我的情況是在類的拷貝構造函數中使用delete [] 的時候出錯,是因為傳入了一個沒有初始化的對象。


7.DAMAGE: after Normal block (#47) at 0x00441DF0
造成上面Debug Error的原因是: delete釋放的內存空間比new的空間要大,破壞了其他正常的數據,造成內存溢出;而導致這個的根本原因是內存越界操作:需要復制的內存空間比分配的內存空間要大!

解決方法: 增加分配的內存空間.


我遇到的情況是:
new的時候分配了n個字節內存,拷貝的時候拷貝了大於n個字符,delete []時就會出現這個錯誤
大家想想字符串在內存中的存放方式。


8.warning C4172: returning address of local variable or temporary
這個只要對引用熟悉,就會知道怎么回事。
這是將一個局部變量作為返回值傳遞給了引用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM