【发布时间】:2013-10-08 12:25:14
【问题描述】:
我有以下代码来加密 C++ DLL 中的字符串
EXPORT WCHAR* EncryptString(WCHAR* stringToEncrypt) {
aes_context ctx;
WCHAR* in = stringToEncrypt;
WCHAR* out;
WCHAR* key = L"TestKey";
BYTE* buffEnc = (BYTE*)malloc(16);
BYTE* keyBuffEnc = (BYTE*)malloc(32);
memset(buffEnc, 0, 16);
memset(keyBuffEnc, 0, 32);
memcpy(buffEnc, in, wcslen(in) * 2);
memcpy(keyBuffEnc, key, wcslen(key) * 2);
aes_set_key(&ctx, keyBuffEnc, 256);
aes_encrypt(&ctx, buffEnc, buffEnc);
out = (WCHAR*)buffEnc;
// free(buffEnc);
// free(keyBuffEnc);
return out;
}
我的问题是我无法释放分配的内存,否则结果会被破坏。我想知道如何在不丢失结果的情况下释放使用的内存?我要更改返回值的类型吗?
提前感谢您的帮助。 问候亨氏
【问题讨论】:
-
您的代码示例不是标准 C++(因为
WCHAR不是标准类型,而是某些系统特定的东西)。您是否考虑过使用std::string或std::wstring? -
你应该复制数据,而不是返回一个指针
-
out正在从 buffEnc 借用内存。最安全的做法是返回一个 std::wstring;在构造中使用 buffEnc。构造 std::wstring 后释放内存,然后返回。 -
或者你应该定义一个约定,你的
EncryptString的调用者需要free它(或者delete它,如果你返回一个指向某个对象的堆指针)。
标签: c++ winapi memory-management dll