内存的申请和释放

常规用法:

VirtualAlloc(
    LPVOID    lpAddress,
    SIZE_T     dwSize,
    DWORD   flAllocationType,
    DWORD   flProtect
    );
lpAddress,指定内存开始的地址。
dwSize,分配内存的大小。
flAllocationType,分配内存的类型。
flProtect,访问这块分配内存的权限。
例:
// 申请虚拟内存
void* pMem = ::VirtualAlloc(NULL, 4096,  MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE ); 
 // 释放虚拟内存。注意:1)第3个参数一定要用MEM_RELEASE,而不能用MEM_DECOMMIT;2)第二个参数一定要用0)
::VirtualFree(pMem, 0, MEM_RELEASE);   
 
### QT 中的内存管理 #### 内存申请释放方法 在 Qt 编程环境中,内存管理主要依赖于 C++ 的标准库 Qt 提供的一些特定工具。Qt 支持多种方式来处理对象的创建销毁: 1. **自动存储持续期变量** 使用栈上分配的对象是最简单的方式之一。这些对象在其作用域结束时会自动析构并回收所占用的空间。 2. **堆上的动态分配** 对于需要更大灵活性或生命周期超出当前函数调用范围的对象,则应使用 `new` `delete` 运算符来进行显式的内存操作[^1]。 ```cpp // 创建一个 QWidget 实例,并将其放在堆上 QWidget* widget = new QWidget(); ... // 当不再需要该实例时手动删除它 delete widget; ``` 3. **智能指针** 推荐的做法是利用现代 C++ 特性中的智能指针(如 `std::unique_ptr`, `std::shared_ptr`),它们能够帮助开发者更好地控制资源的所有权关系及其生命周期,从而有效防止悬空指针等问题的发生[^2]。 ```cpp #include <memory> using namespace std; auto ptrWidget = make_unique<QWidget>(); ... // 不再需要时无需显式 delete, 智能指针会在适当时候自动清理 ``` 4. **父子对象层次结构** Qt 设计了一套基于父子链表的关系模型用于简化 GUI 组件间的关联维护工作;当某个顶级窗口关闭后,其下所有的子控件也会随之一并被清除掉而不需要单独去跟踪每一个部件的状态变化情况。 ```cpp QApplication app(argc, argv); QWidget parent; // 父级组件 QPushButton *button = new QPushButton(&parent); // 子按钮设置为由父类拥有 ... // 关闭应用程序时,所有属于 'parent' 的孩子都会得到妥善处置 return app.exec(); ``` #### 最佳实践建议 - **遵循 RAII 原则**:尽可能让资源获取即初始化 (Resource Acquisition Is Initialization),确保每次获得新资源的同时就绑定了相应的释放逻辑。 - **优先选用智能指针而非原始裸指针**:这有助于降低因忘记释放而导致泄露的可能性,同时也使得代码更加安全可靠。 - **合理规划对象间所有权转移机制**:特别是在多线程环境下共享数据时更要谨慎对待同步问题以免造成竞态条件或其他并发错误。 - **启用调试模式下的检测功能**:借助像 Valgrind 或者 Visual Studio 自带诊断器这样的外部工具可以帮助发现潜在隐患所在之处以便及时修正。 - **定期审查现有实现是否存在过度频繁的小规模分配行为**:如果确实存在这种情况的话不妨尝试引入自定义分配器或是批量预分配策略加以改进效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值