您的位置:首页 > 编程语言 > C语言/C++

C++编译常见错误

2015-06-08 19:45 417 查看
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
这个只要对引用熟悉,就会知道怎么回事。
这是将一个局部变量作为返回值传递给了引用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: