• 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
    这个只要对引用熟悉,就会知道怎么回事。
    这是将一个局部变量作为返回值传递给了引用

  • 相关阅读:
    android-----JNI学习 helloworld
    android布局之线性布局
    Hadoop最基本的wordcount(统计词频)
    有些错误就只因没有全局观
    Eclipse如何生成带有自定tag的Java Doc
    编程之美----高效率地安排见面会----贪心策略
    Servlet Filter
    【解决方法】VS 丢失模板
    你不是一个人在战斗——软件项目团队模型
    [Oracle] Data Pump 详细使用教程(4)- network_link
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/4561770.html
Copyright © 2020-2023  润新知