调用FreeLibrary后不会从内存中删除字符串

时间:2019-02-28 02:39:29

标签: c++ memory

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

std::string test = "blabla";

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

在调用FreeLibrary之前,我要删除类本身,并且肯定会调用其构造函数。

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

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

我需要使用某些功能吗?

1 个答案:

答案 0 :(得分:0)

我想在开始我的回答时说,除非您正在制作某种涉及敏感信息的密码库,否则确实没有这样做的充分理由。实际上,如果您正在执行 操作,则应该采取其他措施来混淆代码,以免弄清楚它在做什么。但是,我将向您展示一种简单的方法。

  

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

那是正常的。栈实际上没有什么特别之处,除了与堆相比,栈访问速度通常更快而且成本更低,并且运行方向相反。

将程序加载到内存中时,它会加载一个.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
}