首页 > 解决方案 > 调用 FreeLibrary 后字符串不会从内存中删除

问题描述

我正在尝试为项目创建 DLL,但在清除字符串时遇到了一些问题。我有一个类,我在堆栈上声明了几个字符串,如下所示:

std::string test = "blabla";

每当我使用 FreeLibrary 从进程中弹出 DLL 时,字符串仍保留在内存中,即使 DLL 不再在进程中。

我在调用 FreeLibrary 之前删除了类本身,并且肯定调用了它的构造函数。

我尝试了几个程序,例如 Process Hacker 和 Cheat Engine,并且在通过内存搜索时都返回了正确的字符串。

奇怪的是它没有删除自己,因为字符串是在堆栈上分配的。

我需要使用某个功能吗?

标签: c++memory

解决方案


我想在回答前先说,除非您正在制作某种涉及敏感信息的加密库,否则确实没有充分的理由这样做。事实上,如果你这样做,你应该采取额外的步骤来混淆代码,这样就不清楚它在做什么。但我会告诉你一个简单的方法来做到这一点。

奇怪的是它没有删除自己,因为字符串是在堆栈上分配的。

这是正常的。堆栈实际上并没有什么特别之处,只是它通常比堆更快且访问成本更低,并且以相反的方向运行。

当您的程序加载到内存中时,它会加载一个.bss和一个.data部分。字符串文字位于.data只读内存部分。如果要确保在内存中看不到某些内容,则不能使用字符串文字。"blabla"引号中是字符串文字。

这是避免使用字符串文字的方法:

#include <string>
#include <iostream>

int main()
{
    std::string test = { 'b','l','a','b','l','a','\0' };
    std::cout << test << std::endl;
    // Okay, I'm done with it now...
    test.assign(6,'\0'); // blabla is replaced with zeroes
}

推荐阅读