MFC中指针越界问题

gaoxing_1985007 2011-02-10 08:14:28
我用指针一位位处理串口返回的数据,有时会出现这样的情况:指针现在所指向的位置已经超过了存放串口返回值的字符串的长度,导致了指针越界。
错误定位在:

if(strPointer>=strTotal.GetLength()) //错误定位在这里
{
break;
}


有下面的错误提示:

Unhandled exception at 0x00404b2a in AgingTest.exe:
0xC0000005:Access violation reading location 0x18210024

出现这样的情况应该怎么处理呢?
...全文
159 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sk_sakula 2011-02-12
  • 打赏
  • 举报
回复
strPoint如果是字符串索引下标的话你就肯定错了。
strTotal.GetLength()返回的是字符串数组大小,而你采用小于等于,那就是到=字符串数组大小,那不就相当于int a[10]; a[10]=1;这样的错误吗?


这个讲的很有道理,在判断这一步就不是你想的了
dukong123 2011-02-12
  • 打赏
  • 举报
回复
估计是其他地方的错误
tulipcaicai 2011-02-12
  • 打赏
  • 举报
回复
看不出来哪里有问题,也许是之前的代码造成的。
mtj530 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 modaoshi3002 的回复:]
看不出来。
strTotal.GetLength() //这个本身是否出错了,就是说这个strTotal已经不是你期望的strTotal了。
[/Quote]
+1
雪人2015 2011-02-10
  • 打赏
  • 举报
回复
strPoint如果是字符串索引下标的话你就肯定错了。
strTotal.GetLength()返回的是字符串数组大小,而你采用小于等于,那就是到=字符串数组大小,那不就相当于int a[10]; a[10]=1;这样的错误吗?
modaoshi3002 2011-02-10
  • 打赏
  • 举报
回复
看不出来。
strTotal.GetLength() //这个本身是否出错了,就是说这个strTotal已经不是你期望的strTotal了。
zyyoung 2011-02-10
  • 打赏
  • 举报
回复
指针地址被覆盖,memcpy/set等操作可能带来这些操作
老邓 2011-02-10
  • 打赏
  • 举报
回复
不知道你这错误是如何定位的。
建议抓个dump定位下。
使用:MiniDumpWriteDump
依赖WinDbg中的DLL,使用头文件:
/*
** Copyright (C) QPSOFT.COM All rights reserved.
*/

#ifndef INCLUDE_MINIDUMPER_H_
#define INCLUDE_MINIDUMPER_H_

#ifdef _MSC_VER

#include <string>

#include <windows.h>
#include <tchar.h>
#pragma comment(lib, "dbghelp.lib")

#include <dbghelp.h>
#pragma comment(lib, "user32.lib")

#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

namespace qp
{

typedef std::string StringA;
typedef std::wstring StringW;

#ifdef _UNICODE
typedef StringW String;
#else
typedef StringA String;
#endif // _UNICODE

typedef BOOL (WINAPI* PFNWRITEDUMP)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION);

class MiniDumper
{
protected:
MiniDumper() { ::SetUnhandledExceptionFilter(&MiniDumper::TopLevelExceptionFilter); }
~MiniDumper() {};

private:
MiniDumper(const MiniDumper&);
const MiniDumper& operator=(const MiniDumper&);

public:
static MiniDumper* Get()
{
static MiniDumper dumper;
return &dumper;
}

void Init(const String& dumpFilePath = String(), const String& appVersion = _T("1.0.0.0"))
{
if (!dumpFilePath.empty() && ::PathIsDirectory(dumpFilePath.c_str()))
m_DumpFilePath = dumpFilePath;
else
{
TCHAR appPath[MAX_PATH];
::GetModuleFileName(NULL, appPath, MAX_PATH);
::PathRemoveFileSpec(appPath);
m_DumpFilePath = appPath;
}

m_AppVersion = appVersion;
}

String GetDumpFile() const
{
SYSTEMTIME st;
::GetLocalTime(&st);
TCHAR dt[11];
wsprintf(dt, _T("%02d%02d%02d%02d%02d"), st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

TCHAR appPath[MAX_PATH];
::GetModuleFileName(NULL, appPath, MAX_PATH);
::PathRemoveExtension(appPath);

String file(m_DumpFilePath);
file += _T("\\");
file += ::PathFindFileName(appPath);
file += _T("_") + m_AppVersion + _T("_");
file += dt;
file += _T(".dmp");
return file;
}

private:
static LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS* ep)
{
LONG ret = EXCEPTION_CONTINUE_SEARCH;

TCHAR dbgHelpDLL[MAX_PATH];
::GetModuleFileName(NULL, dbgHelpDLL, MAX_PATH);

::PathRemoveFileSpec(dbgHelpDLL);
::PathAppend(dbgHelpDLL, _T("dbghelp.dll"));

HMODULE module = ::LoadLibrary(dbgHelpDLL);
if (module == NULL)
return ret;

PFNWRITEDUMP MiniDumpWriteDump = (PFNWRITEDUMP)::GetProcAddress(module, "MiniDumpWriteDump");
if (MiniDumpWriteDump != NULL)
{
String dumpFile = MiniDumper::Get()->GetDumpFile();
HANDLE file = ::CreateFile(dumpFile.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE)
return ret;

_MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = ::GetCurrentThreadId();
mdei.ExceptionPointers = ep;
mdei.ClientPointers = NULL;

MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
/*MiniDumpWithFullMemoryInfo |*/
MiniDumpWithThreadInfo /*|
MiniDumpWithUnloadedModules*/);

if (MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), file, mdt, &mdei, NULL, NULL))
{
::MessageBox(NULL, dumpFile.c_str(), _T("Crash Report!"), MB_TOPMOST | MB_ICONSTOP);
const String openDmp(_T("/select,") + dumpFile);
::ShellExecute(NULL, _T("open"), _T("explorer.exe"), openDmp.c_str(), NULL, SW_SHOWNORMAL);
ret = EXCEPTION_EXECUTE_HANDLER;
}

CloseHandle(file);
}

return ret;
}

private:
String m_DumpFilePath;
String m_AppVersion;
};

} // namespace qp

#endif // _MSC_VER

#endif // INCLUDE_MINIDUMPER_H_
bdmh 2011-02-10
  • 打赏
  • 举报
回复
自己调试一下吧,这两句根本看不出什么,错误很可能是其他隐藏的爆发了
pengzhixi 2011-02-10
  • 打赏
  • 举报
回复
不像这里的错误

64,654

社区成员

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

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