首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试Doom 3堆栈实现时堆栈损坏

测试Doom 3堆栈实现时堆栈损坏
EN

Stack Overflow用户
提问于 2013-09-19 17:42:57
回答 1查看 108关注 0票数 0

我得到了

变量'a‘周围的堆栈已损坏。

在尝试此代码时:

代码语言:javascript
复制
    #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";
    }

H源代码位于这里

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

我是c/c++的初学者/中级,所以请你帮我理解idStack是如何工作的,我做错了什么。

我尝试使用idStack(type,next)宏创建堆栈对象--据我所知,您应该将产品的一个元素放在"next“参数中,以便它计算偏移量。它从未正确工作(无论是重量还是价格),虽然我没有得到任何堆栈损坏错误,但变量没有正确打印出来。

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

编辑:我觉得应该用自定义分配器在堆上分配足够的内存(3* like of (A)),然后在新分配的内存开始时初始化a。我向正确的方向倾斜了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-19 19:09:26

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

因此,您可以做以下修改:

代码语言:javascript
复制
struct product {
    int weight;
    float price;
    struct product* next;   // <-- link pointer field
} ;


// the stack declaration:

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

不用说,这类容器一般不被认为是良好做法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18901530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档