一个伪内存泄漏问题

        我在一个dll中使用了静态全局对象。全局对象包含了一个STL容器,dll提供一个Add函数。用户端使用Add向STL容器添加元素。当程序结束时全局对象析构。但VS output窗口显示有内存泄漏。经分析,竟然是STL容器,内存泄漏。这怎么可能呢。原来在我的MFC程序中,在_AFX_DEBUG_STATE_AFX_DEBUG_STATE析构函数中调用了_CrtDumpMemoryLeaks();。而_AFX_DEBUG_STATE_AFX_DEBUG_STATE析构函数在我定义的全局函数前析构,调用_CrtDumpMemoryLeaks(),自然认为全局对象中保存的堆对象有内存泄漏了。安全的作法是,如下例设置flag。程序在退出时(进程结束时)自动调用_CrtDumpMemoryLeaks()。程序保证在所有全局对象析构后调用_CrtDumpMemoryLeaks();
#include <iostream>
#include <crtdbg.h>


using namespace std;


void main()
{
	int * p = new int[3];
	cout << "Test Memory Leak" << endl;
}
#include <iostream>
#include <crtdbg.h>


using namespace std;


void main()
{
	//_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
	//<无效设置方法>
	//_CrtSetDbgFlag只能设置一个值所以要将要设置的参数按位组合
	//_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF);
	//_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
	//</无效设置方法>
	int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); //报告出泄漏的内存
	flag |= _CRTDBG_LEAK_CHECK_DF;
	_CrtSetDbgFlag(flag);
	int * p = new int[3];
	cout << "Test Memory Leak" << endl;
}


注:

_CRTDBG_LEAK_CHECK_DF  设置这个flag后,在程序退出时,程序自动调用检测内存泄漏,调用_CrtDumpMemoryLeaks函数。

_CRTDBG_REPORT_FLAG  设置这个flag后,程序退出时,调用CrtDumpMemoryLeaks,默认dump到vs的debug输出窗口。

参考资料

http://msdn.microsoft.com/en-us/library/5at7yxcs(v=vs.80).aspx

在C++中,我们可以模拟一个简单的内存分配和加密过程。首先,假设我们有一个内存池类`MemoryPool`负责管理加密区域,以及一个加密函数`encryptData`。以下是相关的代码: ```cpp class MemoryPool { private: std::vector<char*> memoryBlocks; // 内存块容器 std::mutex mutex; // 用于线程安全 public: void* allocate(size_t size) { // 尝试从内存池获取可用空间 std::lock_guard<std::mutex> lock(mutex); if (memoryBlocks.empty() || memoryBlocks.back() + size > memoryLimit) { // 如果内存不足,扩展内存池 memoryBlocks.push_back(new char[calculateNewSize(size)]); } else { // 如果有空闲空间,分配并更新指针 void* result = memoryBlocks.back(); memoryBlocks.back() += size; return result; } return encryptData(result, size); // 加密后返回 } ~MemoryPool() { for (char* block : memoryBlocks) { delete[] block; } } private: size_t calculateNewSize(size_t requestedSize) { // 假设内存扩展是以固定倍数进行,这里省略细节 return requestedSize * expansionFactor; } void* encryptData(void* data, size_t size) { // 这里只是一个简单示例,实际加密可能使用更复杂的算法 return static_cast<void*>(Encrypt(data, size)); } }; // 假设Encrypt是实际加密函数,此处仅做展示 void* Encrypt(void* data, size_t size) { // 对data区域进行加密操作 // ... return data; // 这里为了简化示例,假设加密后的数据还是原始地址,实际应用需替换 } ``` 这只是一个基础的框架,真正的内存池管理和加密实现可能会更复杂,包括处理内存泄漏、内存碎片等问题。请注意,上述代码中的`Encrypt`函数需要你自己实现一个实际的加密算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值