如何安全清零std::string_view?调用SecureZeroMemory为何触发异常?
问题分析:std::string_view调用SecureZeroMemory触发写入访问冲突异常
错误根源
你犯的核心错误是试图往只读内存中写入数据:
- 用字符串字面量初始化
std::string_view时,它指向的是程序的只读数据段(通常是.rodata段),这块内存受操作系统保护,不允许任何写入操作。SecureZeroMemory的作用是将指定内存区域清零,必然触发写入访问违例。 - 而
std::string初始化时,会把字符串字面量的内容复制到自己管理的可写内存(堆内存或短字符串优化的栈内存)中,所以调用SecureZeroMemory修改这块内存完全合法。
代码对比
触发异常的代码
std::string_view test = "kYp3s6v9y$B&E)H@"; SecureZeroMemory((void*)test.data(), test.length());
抛出异常信息:
Exception thrown: write access violation.
vptr was 0x7FF755084358.
可正常运行的代码
std::string test = "kYp3s6v9y$B&E)H@"; SecureZeroMemory((void*)test.data(), test.length());
关键提示
std::string_view是只读视图,它不拥有内存所有权,只是对现有内存的引用。即使你强制将data()转换为void*,也无法改变底层内存不可写的属性。- 只要涉及修改字符串内容的操作,都必须使用
std::string这类拥有内存所有权的字符串类型,而非string_view。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

