【发布时间】:2011-03-04 18:43:32
【问题描述】:
我有一个内部的 malloc/realloc/free 的自定义字符串类;对于某些字符串附加工作正常,但在某些其他字符串将总是失败(小或大分配)。相同的代码在不同的项目上运行良好,尽管它是一个 ANSI 版本。
我相信我正确地实现了这一点,但很可能我忽略了一些东西。当我在打开日志后尝试使用“szLog”缓冲区时会发生错误。这仅包含程序文件目录的路径(总共 40 个字符)。使用没有“日志文件”前缀的相同缓冲区可以正常工作,因此 realloc 部分存在问题。是的,日志确实打开了。
我得到 0xC0000005:访问冲突读取位置 0x00660063。 仅在使用 realloc 时(但如前所述,它并不总是失败 - 在这种情况下,当输入 szLog 时 - 但其他变量字符串/缓冲区也可以)。
HeapReAlloc 是 realloc.c 中的失败函数,errno 为 22。
我已经剥离了 cmets 以尝试使帖子尽可能小!任何帮助将不胜感激。
gData.szLogStr 是 UString,IsNull 是 "x == NULL" 和 unichar 的定义> 只是 wchar_t 的 typedef
class UString : public Object
{
private:
unichar* mpsz;
unichar* mpszPrev;
UINT muiAlloc;
UINT muiLen;
public:
... other functions ...
UString& operator << (const unichar* pszAdd)
{
if ( IsNull(pszAdd) )
return (*this);
if ( IsNull(mpsz) )
{
muiAlloc = ((str_length(pszAdd)+1) * sizeof(unichar));
if ( IsNull((mpsz = static_cast<unichar*>(malloc(muiAlloc)))) )
{
SETLASTERROR(ERR_NOT_ENOUGH_MEMORY);
muiAlloc = 0;
return (*this);
}
mpszPrev = mpsz;
muiLen = str_copy(mpsz, pszAdd, muiAlloc);
}
else
{
UINT uiNewAlloc = (muiAlloc + (str_length(pszAdd) * sizeof(unichar)));
if ( muiAlloc < uiNewAlloc )
{
uiNewAlloc *= 2;
/* Fails */
if ( IsNull((mpsz = static_cast<unichar*>(realloc(mpsz, uiNewAlloc)))) )
{
SETLASTERROR(ERR_NOT_ENOUGH_MEMORY);
mpsz = mpszPrev;
return (*this);
}
mpszPrev = mpsz;
muiAlloc = uiNewAlloc;
}
muiLen = str_append(mpsz, pszAdd, muiAlloc);
}
return (*this);
}
这是从 main via 中调用的:
UString szConf;
unichar szLog[MAX_LEN_GENERIC];
szConf << ppszCmdline[0];
szConf.replace(_T(".exe"), _T(".cfg"));
if ( GetPrivateProfileString(_T("Application"), _T("LogFile"), NULL, szLog, sizeofbuf(szLog), szConf.str()) == 0 )
{
UINT uiLen = str_copy(szLog, szConf.str(), sizeofbuf(szLog));
szLog[uiLen-3] = 'l';
szLog[uiLen-2] = 'o';
szLog[uiLen-1] = 'g';
}
if ( ApplicationLog::Instance().Open(szLog, CREATE_ALWAYS) )
{
gData.szLogStr.clear();
/* Erroring call */
gData.szLogStr << _T("Log file '") << szLog << _T("' opened");
APP_LOG(LL_WriteAlways, NULL, gData.szLogStr);
ObjMgr::Instance().DumpObjects(LogDumpedObjects);
}
【问题讨论】:
标签: c++ c visual-studio-2010 visual-c++