标签 C++ 下的文章

Debug Assertion Failed! File: dbgdel.cpp Line: 47 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: D:\dev\out\test.exe
File: dbgdel.cpp
Line: 47

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
中止(A)   重试(R)   忽略(I)   
---------------------------

原因找到了。PTCHAR test = new TCHAR[1024]之后使用了test++之类的语句后delete[] test。 这样delete指向的并非test的头。所以报错。可以在new完之后用一个PTCHAR来保存head pointer: testHead = test。 然后delete[] testHead。

不用AppWizard创建MFC程序

十个月以前写过“不用MFC AppWizard创建MFC项目”,不过是转载别人的,今天自己来写一次。

首先我们用AppWizard创建一个程序mfc1,然后查看mfc1程序属性里面的C/C++命令行和链接器命令行:

C/C++命令行:

/Od /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_AFXDLL" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Yu"stdafx.h" /Fp"Debugmfc1.pch" /Fo"Debug" /Fd"Debugvc80.pdb" /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt 链接器命令行:

/OUT:"d:devDebugmfc1.exe" /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:"Debugmfc1.exe.intermediate.manifest" /DEBUG /PDB:"d:devdebugmfc1.pdb" /SUBSYSTEM:WINDOWS /ENTRY:"wWinMainCRTStartup" /MACHINE:X86 /ERRORREPORT:PROMPT 接下来我们根据以上命令行来创建一个hardcode程序,添加新项目里面选择“空项目”,然后创建一个头文件hello.h和一个cpp文件hello.cpp(代码来自MFC Windows程序设计(第二版)):

hello.h

class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance ();
};

class CMainWindow : public CFrameWnd
{
public:
    CMainWindow ();

protected:
    afx_msg void OnPaint ();
    DECLARE_MESSAGE_MAP ()
};

hello.cpp

#include <afxwin .h>
#include "Hello.h"

CMyApp myApp;

/////////////////////////////////////////////////////////////////////////
// CMyApp member functions

BOOL CMyApp::InitInstance ()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow (m_nCmdShow);
    m_pMainWnd->UpdateWindow ();
    return TRUE;
}

/////////////////////////////////////////////////////////////////////////
// CMainWindow message map and member functions

BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
    ON_WM_PAINT ()
END_MESSAGE_MAP ()

CMainWindow::CMainWindow ()
{
    Create (NULL, _T ("The Hello Application"));
}

void CMainWindow::OnPaint ()
{
    CPaintDC dc (this);
    
    CRect rect;
    GetClientRect (&rect);

    dc.DrawText (_T ("Hello, MFC"), -1, &rect,
        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
</afxwin>

以上代码的功能是建立一个最简单的窗口,中心位置用CPaintDC显示一些文字。

点击生成,报错:

d:vs8vcatlmfcincludeafx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] 提示如果代码生成->运行时库选择了/MD[d]必须定义_AFXDLL,否则不要使用/MD[d]。我们在C/C++->预处理器->预处理器定义加上:WIN32;_WINDOWS;_DEBUG;_AFXDLL;_UNICODE;UNICODE;保持和mfc1程序的一致性。

点击生成,报了另外的错误:

1>正在编译...
1>Hello.cpp
1> WINVER not defined. Defaulting to 0x0502 (Windows Server 2003)
1>正在链接...
1>LINK : 没有找到 d:devDebughardcode.exe 或上一个增量链接没有生成它;正在执行完全链接
1>LINK : fatal error LNK1561: 必须定义入口点

新建一个stdafx.h作预编译头,内容是一些定义版本的信息:

#ifndef WINVER             // 允许使用特定于 Windows XP 或更高版本的功能。
#define WINVER 0x0501       // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif

#ifndef _WIN32_WINNT        // 允许使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif                      

#ifndef _WIN32_WINDOWS      // 允许使用特定于 Windows 98 或更高版本的功能。
#define _WIN32_WINDOWS 0x0410 // 将它更改为适合 Windows Me 或更高版本的相应值。
#endif

#ifndef _WIN32_IE           // 允许使用特定于 IE 6.0 或更高版本的功能。
#define _WIN32_IE 0x0600    // 将此值更改为相应的值,以适用于 IE 的其他版本。值。
#endif

然后设置 C/C++ -> 预编译头 -> 创建/使用预编译头 -> 创建预编译头(/Yu)。

在hello.cpp文件中的最顶部加入

#include "stdafx.h"

然后设置 链接器 -> 系统 -> 子系统 -> Windows (/SUBSYSTEM:WINDOWS)

设置 链接器 -> 高级 -> 入口点 -> wWinMainCRTStartup

点击生成,OK了。

不用AppWizard创建MFC程序