测试《毁灭战士3》堆栈实现时堆栈损坏
Corrupted stack while testing Doom 3 Stack implementation
I get
变量"a"周围的堆栈已损坏。
在尝试此代码时:
#include "Stack.h"
#include <iostream>
struct product {
int weight;
float price;
} ;
void main(void){
product a = {1, 4.0f};
product b = {2, 5.0f};
product c = {3, 6.0f};
idStackTemplate<product, sizeof(product)> stack;
stack.Add(&a);
stack.Add(&b);
stack.Add(&c);
product * first, * second, *third;
third = stack.Get();
second = stack.Get();
first = stack.Get();
std::cout << first->price << "t" << first->weight << "n";
std::cout << second->price << "t" << second->weight << "n";
std::cout << third->price << "t" << third->weight << "n";
}
Stack.h 源代码位于此处!
否则,代码将打印出正确的值。
我是 c/c++ 的初学者/中级,所以你能帮我了解 idStack 的工作原理以及我做错了什么吗?
我尝试使用 idStack(type, next) 宏创建堆栈对象 - 据我了解,您应该将产品元素之一用于"next"参数,以便它计算偏移量。它从未正常工作(重量或价格),尽管我没有收到任何堆栈损坏错误,但变量无法正确打印出来。
我还在 Doom 3 源代码中看到了一些使用内存池动态分配的代码,这可以解释这一点,但我看不到这里使用了这种技术......
编辑:我觉得我应该使用该自定义分配器在堆(3 * sizeof(a))上分配足够的内存,然后在新分配的内存开始时初始化一个。我的方向是否正确?
此堆栈实现是侵入性的 - 它期望有一个指针可供堆栈模板使用。 在这种情况下,第二个模板参数旨在具有该指针的偏移量 - 而不是正在存储的对象的大小。
因此,您可以进行以下修改:
struct product {
int weight;
float price;
struct product* next; // <-- link pointer field
} ;
// the stack declaration:
idStackTemplate<product, offsetof(struct product, next)> stack;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
不用说,这种容器通常不被认为是好的做法。
相关文章:
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 了解使用堆栈实现队列的递归调用机制
- 为堆栈实现泛型集合
- 未分配被释放的指针(将堆栈实现为链表时)
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 河内塔C++堆栈实现
- 线程安全堆栈实现
- 使用导致分段错误的类C++中的堆栈实现
- C++堆栈实现弹出函数不起作用
- 我的矩阵堆栈实现(OpenGL ES 2.0)有什么问题
- 堆栈实现C
- C 堆栈实现意外输出
- 指针数组堆栈实现
- C++ 堆栈实现硬件错误
- C++堆栈实现 - 两个版本的 top 方法
- 无法理解堆栈实现的isEmpty函数中的返回语句
- 在编写堆栈实现 c++ 时遇到问题
- 使用堆栈实现C++
- 测试《毁灭战士3》堆栈实现时堆栈损坏
- 使用 3 个堆栈实现排序.(分段错误 - 核心转储)