gpt4 book ai didi

c++ - 测试 Doom 3 Stack 实现时堆栈损坏

转载 作者:行者123 更新时间:2023-11-28 00:41:04 27 4
gpt4 key购买 nike

我明白了

Stack around the variable 'a' was corrupted.

在尝试这段代码时:

    #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 源代码位于here !

否则代码会打印出正确的值。

我是 c/c++ 的初级/中级,所以请您帮助我了解 idStack 的工作原理以及我做错了什么。

我已经尝试使用 idStack(type, next) 宏创建堆栈对象 - 根据我的理解,您应该为“下一个”参数放置一个产品元素,以便它计算偏移量。尽管我没有收到任何堆栈损坏错误,但它从未正确工作(无论是重量还是价格),但变量没有正确打印出来。

我还在 Doom 3 源代码中看到了一些使用内存池动态分配的代码,这可以解释这一点,但我看不到这里使用了这种技术......

编辑:我觉得我应该使用自定义分配器在堆 (3*sizeof(a)) 上分配足够的内存,然后在新分配的内存的开头初始化 a。我的方向是否正确?

最佳答案

这个堆栈实现是侵入式的——它期望有一个指针可供堆栈模板使用。在这种情况下,第二个模板参数旨在具有该指针的偏移量 - 而不是所存储对象的大小。

因此您可以进行以下修改:

struct product {
int weight;
float price;
struct product* next; // <-- link pointer field
} ;


// the stack declaration:

idStackTemplate<product, offsetof(struct product, next)> stack;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

不用说,这种容器通常不被认为是好的做法。

关于c++ - 测试 Doom 3 Stack 实现时堆栈损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901530/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com