gpt4 book ai didi

c++ - 动态分配的 LPTSTR (TCHAR*) 和 delete[] 运算符的不稳定行为?

转载 作者:行者123 更新时间:2023-11-28 03:48:17 27 4
gpt4 key购买 nike

我试图构建一个处理字符串运算符的类。但是,由于没有令人信服的原因,它有时会在 delete[] 运算符期间崩溃。我使用 strsafe 库来执行所有内部字符串操作。

//字符串

LPTSTR m_string;

void QString::operator +=(const QString &_in) //Concat m_string with _in.m_string
{
size_t size = strlength(m_string) + strlength(_in.m_string) +1; //new size
LPTSTR buffer = new TCHAR[size]; //alloc buffer
::StringCchCopy(buffer,strlength(m_string)+1,m_string); //copy current m_string to buffer

::StringCchCat(buffer, size, _in.m_string); //concat buffer with the input

Replace(buffer); //replace this object with m_string

delete[] buffer; //dealloc
}


void QString::Replace(LPCTSTR src) //replace m_string with src
{
size_t size = strlength(src)+1; //new size
Alloc(size);
::StringCchCopy(m_string,size,src); //copy src to m_string
}


void QString::Alloc(size_t size) //Dynamic allocation
{
if(m_string != NULL) Free();
m_string = new TCHAR[size+1];
}


void QString::Free() //Free m_string
{
delete[] m_string; //Sometime crashes here
m_string = NULL;
}


QString ToStr(int _in) //Convert Integer to qstring
{
int size = 1;
int f = _in;

while(f > 0)
{
f /=10;
size++;
}

TCHAR* buf = new TCHAR[size];

for(int i = 0; i < size; i++) buf[i] = (TCHAR)TEXT("");

QString result(L"undef");

if(::_itow_s(_in,buf,size,10) == 0) //No error code = ok
{
result = buf;
}
delete[] buf;
return result;
}

//示例1:不崩溃

int ::WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
QString a(L"");
a += L"TEST";
a += ToStr(1000);

::MessageBox(0,a.GetStr(),L"NOTHING",MB_OK);

return 0;
}

//示例2:打印奇怪的字符加上一些当前字符(Unicode问题?)

 int ::WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
QString a(L"");
a += L"TESTTESTESTEST";
a += ToStr(1000);
::MessageBox(0,a.GetStr(),L"NOTHING",MB_OK);

return 0;
}

//示例3:加载时崩溃

int ::WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)
{
QString a(L"");
a += L"TESTTESTESTEST";
a += ToStr(1000);
a += L"TESTESTEST";
a += ToStr(100);
::MessageBox(0,a.GetStr(),L"NOTHING",MB_OK);

return 0;
}

它在 Free() 中的 delete[] 运算符上崩溃。两者皆有错误

HEAP[StringTest.exe]:指定给 RtlFreeHeap 的地址无效(003C0000、003C46A8)

HEAP[StringTest.exe]:003C4750 处的堆 block 已在 003C475C 处修改,超过请求的大小 4

最佳答案

您的构造函数没有将 m_string 初始化为 NULL(根据您自己在上面的评论)。这会导致随机 Free() 失败。

正如 selbie 所指出的,此代码中还有其他错误和低效之处。例如,Replace 总是重新分配,即使从已经分配的 += 调用时也是如此。并且您在 Replace 和 Alloc 中都添加了 1,这表明您不清楚哪些函数采用包含终止符的值,哪些不采用。

除非这是学习或作业练习,否则我强烈建议不要编写自己的字符串类 - 与使用 std::string(或 ATL::CString,如果你愿意的话)。

马丁

关于c++ - 动态分配的 LPTSTR (TCHAR*) 和 delete[] 运算符的不稳定行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6659548/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com