编译x64程序,debug模式一运行就崩溃,release模式正常,这可能是什么原因?

沙尘暗影 2014-01-27 09:06:49
...全文
464 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
沙尘暗影 2014-01-27
  • 打赏
  • 举报
回复
我又改回原来的程序了,也没出问题,很奇怪吧?
derekrose 2014-01-27
  • 打赏
  • 举报
回复
为什么最近这种问题特别多
沙尘暗影 2014-01-27
  • 打赏
  • 举报
回复
解决了,把一个变量的作用域放大一些
赵4老师 2014-01-27
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
沙尘暗影 2014-01-27
  • 打赏
  • 举报
回复
文件main.cpp
#include "Lyric.h"

#include <iostream>
using namespace std;

BOOL StrToLong(const WCHAR* pStr, int NumberOfChars, LONG* pTime);

int _tmain()
{
	const WCHAR* const pFileName = L"E:\\黄磊 - 我想我是海.lrc";

	HANDLE hFile = ::CreateFile(pFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
		nullptr, OPEN_EXISTING, 0, nullptr);

	if (INVALID_HANDLE_VALUE == hFile)
	{
		cout << "打开歌词文件失败" << endl;
		exit(1);
	}
	else
	{
		cout << "打开文件: " << "E:\\黄磊 - 我想我是海.lrc" << endl << endl;
		::CloseHandle(hFile);
		hFile = nullptr;
	}

	CLyric Lyric;
	bool Result = Lyric.LoadLyric(pFileName, 0);
	if (Result)
	{
		cout << "载入歌词成功" << endl;
	}
	else
	{
		cout << "载入歌词失败" << endl;
	}

	return 0;
}
沙尘暗影 2014-01-27
  • 打赏
  • 举报
回复
文件Lyric.cpp
#include "Lyric.h"

#include <iostream>
using namespace std;

BOOL StrToLong(const WCHAR* pStr, int NumberOfElements, LONG* pTime);

WCHAR CLyric::s_FileBuffer[] = {};

CLyric::CLyric() :
m_fValid(false),
m_CharNumber(0)
{
	memset(m_FileName, 0, sizeof(m_FileName));
}

CLyric::~CLyric()
{
	m_fValid = false;
}

bool CLyric::LoadLyric(PCWSTR pFileName, LONG /*CurrentTime*/)
{
	if (!LoadFileToBuffer(pFileName))
	{
		return false;
	}

	int X = 0;
	int Y = 0;

	static bool fFirstLeft = true;
	static bool fFirstRight = true;

	bool fShouldAnalysis = false; // 应该解析时间吗?
	bool fTextShouldAnalysis = false; // 应该解析文本吗?

	int k = 0;
	// 0 表示还没有遇到过 [ 或 ]
	// 1 表示上一个括号是 [
	// 2 表示上一个括号是 ]

	for (int i = 0; i < m_CharNumber; i++)
	{
		switch (s_FileBuffer[i])
		{
		case L'[':
			if (fFirstLeft)
			{
				fFirstLeft = false;
				X = i;
				k = 1;
				fTextShouldAnalysis = false;
			}
			else if (k == 1) // 第 n>=2 次遇到 [ ,且上一个括号是 [
			{
				fTextShouldAnalysis = false;
			}
			else // 第 n>=2 次 [ ,且上一个括号是 ]
			{
				X = i;
				k = 1;
				fTextShouldAnalysis = true;
			}
			break;
		case L']':
			if (fFirstRight)
			{
				if (k == 1)
				{
					fFirstRight = false;
					Y = i;
					k = 2;
					fShouldAnalysis = true;
				}
			}
			else if (k == 1) // 第 n>=2 次遇到 ] ,且上一个括号是 [
			{
				Y = i;
				k = 2;
				fShouldAnalysis = true;
			}
			else // 第 n>=2 次遇到 ] ,且上一个括号是 ]
			{
				fShouldAnalysis = false;
			}

			// 提取时间标签:
			if (fShouldAnalysis)
			{
				LONG Time = 0;
				if (StrToLong(s_FileBuffer + X + 1, Y - X - 1, &Time))
				{
					cout << Time << endl;
				}
				else
				{
					cout << "转换失败" << endl;
				}
			}
			break;
		default:
			break;
		}
	}

	return true;
}

bool CLyric::LoadFileToBuffer(PCWSTR pFileName)
{
	HANDLE hFile = ::CreateFile(pFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
		nullptr, OPEN_EXISTING, 0, nullptr);

	if (INVALID_HANDLE_VALUE == hFile)
	{
		return false;
	}

	LARGE_INTEGER liFileSize = {};
	if (!::GetFileSizeEx(hFile, &liFileSize))
	{
		::CloseHandle(hFile);
		return false;
	}
	
	if (liFileSize.QuadPart > (LONGLONG)MAX_FILE_SIZE)
	{
		::CloseHandle(hFile);
		return false;
	}

	WORD bom = 0;
	DWORD dwNumberOfBytesRead = 0;
	::ReadFile(hFile, &bom, 2, &dwNumberOfBytesRead, nullptr);
	if (dwNumberOfBytesRead != 2 || bom != 0xFEFF) // utf16-le 的前两个字节是 FF FE
	{
		::CloseHandle(hFile);
		return false;
	}

	// 现在文件指针已经移动到了 2

	int FileSize = (int)(liFileSize.QuadPart);
	FileSize -= 2; // 字节序的字节数
	int CharNumber = FileSize / 2; // 保留偶数

	// 现在,只剩下了 CharNumber 个WCHAR,要把它们读入 s_FileBuffer

	memset(s_FileBuffer, 0, sizeof(s_FileBuffer));
	if (!::ReadFile(hFile, (PVOID)s_FileBuffer, (DWORD)(sizeof(WCHAR) * CharNumber), &dwNumberOfBytesRead, nullptr))
	{
		::CloseHandle(hFile);
		return false;
	}

	m_CharNumber = CharNumber;
	::CloseHandle(hFile);
	return true;
}
沙尘暗影 2014-01-27
  • 打赏
  • 举报
回复
文件Lyric.h
#include "PublicGo.h"

class CTextLine
{
private:
	enum :int32 { MAX_LINE_LEN = 200 };

private:
	int32 Time;
	WCHAR sText[MAX_LINE_LEN];

	friend class CLyric;
};

class CLyric
{
private:
	enum :int32
	{
		MAX_FILE_SIZE = 1048576L, // 1 MB
		MAX_CHAR_NUMBER = MAX_FILE_SIZE / 2
	};

public:
	CLyric();
	~CLyric();
private:
	CLyric(const CLyric&) = delete;
	CLyric& operator = (const CLyric&) = delete;

public:
	bool LoadLyric(PCWSTR pFileName, int32 CurrentTime);
	bool TimeTo(int32 CurrentTime);
public:
	bool LoadFileToBuffer(PCWSTR pFileName);

private:
	bool m_fValid;
	int m_CharNumber;
	WCHAR m_FileName[MAX_PATH]; // 维护文件名,而不是文件句柄
	static WCHAR s_FileBuffer[MAX_CHAR_NUMBER];
};
FancyMouse 2014-01-27
  • 打赏
  • 举报
回复
空指针引用。说明程序的确有问题。不贴代码鬼知道问题在哪
沙尘暗影 2014-01-27
  • 打赏
  • 举报
回复
另外,编译成32位程序,debug和release都是正常的
赵4老师 2014-01-27
  • 打赏
  • 举报
回复
多线程处理该加锁的地方未加锁 ?

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧