处理分配的内存和堆栈内存
Handling allocated and stack memory
我提供了两种向我的集合添加元素的方法,一种是每个常量引用,一次是每个指针。
void push_back(const value_type *val) {
element *elem = new element(val);
//...
}
void push_back(const value_type &val) {
push_back(&val);
}
element
类将值保存为指针。
class element {
private:
const value_type *value;
public:
element(const value_type *value):
value(value) {
}
~element() {
delete value;
}
显然,当弹出元素或删除集合时,如果将元素添加为指针,则必须释放内存。但是,当元素未手动分配并通过引用传递时,这会产生错误。
如果元素是按时间动态分配的,除了额外存储之外,还有其他选择push_back吗?
只要保持一致,并始终存储一个可以删除的指针。
void push_back(const value_type &val) {
push_back(new value_type(val));
}
总的来说,这是一个有缺陷的设计。您可以通过不同的方式更改设计以实现所需的内容。例如,马克的回答是一种直截了当的方法。
话虽如此,这是使用您的设计的可能解决方案。再一次,我不推荐它,因为它依赖于编译器如何构建堆栈的内部结构,并且不能跨编译器/平台移植。
基本上,在~element()
中,您可以通过将其与当前堆栈指针进行比较来检查存储在 value
中的地址是在堆栈上还是在堆上。如果存储在 value
中的地址高于堆栈指针,则它在堆栈上,不应删除(提供堆栈在地址空间顶部的通常位置)。如果它小于堆栈指针 - 它在堆上。
说明地址关系的代码(GCC,x64 linux):
#include <iostream>
int main()
{
int * heap_(new int(0));
int stack_(0);
void * rsp_(nullptr);
asm("mov %%rsp, %0" : "=m" (rsp_));
std::cout << "heap addresst: " << heap_
<< "nstack addresst: " << &stack_
<< "nstack pointert: " << rsp_ << std::endl;
delete (heap_);
return (0);
}
程序输出:
heap address : 0xc52010
stack address : 0x7fff528ffee4
stack pointer : 0x7fff528ffee0
ideone.com 可以访问 GCC,但使用 x86 版本 - esp
注册而不是rsp
.代码必须更改(不可移植性)。
相关文章:
- 为什么调用堆栈数组会导致内存泄漏
- 为什么堆栈和堆在内存中分离得如此之多?
- c++ 动态内存 堆栈中的分配
- 巨大的内存分配:堆栈与堆
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 唯一指针是否在堆或堆栈上分配内存?
- 清除在 main() 中分配的堆栈内存?
- 如何以编程方式区分在内存的堆和堆栈部分创建的对象
- 其他线程堆栈上的可用内存无效
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- C++堆栈内存管理问题
- 为什么在编译时需要知道对象的内存配置文件以进行堆栈放置?
- 如果没有指针,如何识别堆栈上的内存?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 为什么分配堆内存比分配堆栈记忆更快
- 双精度为“无符号长长”会导致内存(堆栈?)损坏
- C++内存堆栈/寄存器范围
- 堆栈内存/堆栈
- 指向地址和内存堆栈的指针