【问题标题】:C++ template instantiation pointer null errorC++模板实例化指针空错误
【发布时间】:2013-10-23 19:00:25
【问题描述】:

我想编写自己的堆栈版本,这就是我所拥有的:

template<class myStackType> class myStackClass
{
    myStackType array[1000];
    int size;
public:
    myStackClass()
    {
        size = 0;
    }
    void pop()
    {
        size--;
    }
    void push(myStackType a)
    {
        array[size] = a;
        size++;
    }
    myStackType top()
    {
        return array[size-1];
    }
    bool empty()
    {
        return(size == 0);
    }
};

但是当我尝试实际使用它时

struct grade
{    
    int mid;
    int final;
    string name;
    grade(int mid1 = 0, int final1 = 0, string name1 = 0)
    {
        mid = mid1;
        final = final1;
        name = name1;
    }
};

myStackClass<grade> myStack;

我得到一个调试断言失败:无效的空指针

另一方面,std::stack 在相同数据类型的相同位置工作得很好

我做错了什么?

谢谢!

【问题讨论】:

  • 如果我没记错的话,堆栈会随着用户插入的越来越多而增长。你为什么让它有最多 1000 个元素?

标签: c++ class templates pointers instantiation


【解决方案1】:

这是错误的:

string name1 = 0

它尝试从const char* 构造一个string,即0 - 这是不允许的。您可能的意思是:

string name1 = ""

【讨论】:

    【解决方案2】:

    您正在将 0 分配给构造函数中的字符串。这就是错误。编译器试图将 0 解释为 char *,即。 e. C 风格的字符串。但是因为是0,所以被解释为NULL指针。

    您可能还想进行一些错误检查以确保您的堆栈不会溢出,或者您不会尝试弹出空堆栈。

    【讨论】:

    • 就是这样,谢谢 - 虽然现在我很困惑为什么它可以使用 std::stack 而不是我的......哦,好吧,谢谢
    • 这取决于堆栈类如何分配其存储空间。如果 std::stack 正在使用 T* 它不需要在其构造函数中实际分配任何 T 。你的使用的是一个数组,所以如果我没记错的话,存储中的每个元素都将被初始化,T() 将被调用,是的,然后 string = nullptr 将会发生并随之发生崩溃跨度>
    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2020-10-20
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多