为何删除wchar_t指针会崩溃?WM_SETTEXT使用后指针问题咨询
为什么
delete f;会导致崩溃? 其实问题的根源和WM_SETTEXT没有关系——崩溃完全是因为你错误地对字符串字面量使用了delete操作。我来拆解一下:
1. 字符串字面量的内存本质
你代码里的L"test1"是宽字符串字面量,这类数据是被编译器放在程序的只读内存段(比如Windows平台的.rdata段)里的,它不是通过new/malloc在堆上分配的内存。
而delete(或者对应数组的delete[])的唯一合法用途,是释放通过new(或new[])从堆上分配的内存。对非堆内存(比如只读段的字面量、栈上的变量)调用delete属于未定义行为,程序崩溃是这种行为最常见的结果。
2. 关于WM_SETTEXT的补充说明
顺便提一下:当你给编辑框发送WM_SETTEXT消息时,系统会复制一份你传入的字符串内容到编辑框自身的内部缓冲区,不会保留你传入的原指针。所以不管你之后怎么处理原指针(只要不非法操作内存),编辑框的内容都不会受影响。你这里的崩溃和消息发送的过程完全无关,只是刚好触发了非法内存释放的问题。
正确的内存管理示例
如果确实需要使用可手动释放的字符串(比如动态生成内容),应该用堆分配的方式:
// 用new[]分配足够容纳字符串+结束符的堆内存 wchar_t* f = new wchar_t[6]; // L"test1"是5个字符+1个'\0',共6个位置 wcscpy(f, L"test1"); SendMessage(hWndEdit1, WM_SETTEXT, 0, (LPARAM)f); // 用完后用delete[]释放(注意是delete[],因为是数组类型的分配) delete[] f;
更推荐的是用C++标准库的std::wstring来自动管理内存,彻底避免手动释放的错误:
std::wstring f = L"test1"; SendMessage(hWndEdit1, WM_SETTEXT, 0, (LPARAM)f.c_str()); // 不需要手动delete,std::wstring会在生命周期结束时自动释放内存
内容的提问来源于stack exchange,提问作者Mesut
相关产品推荐
相关产品推荐

