【发布时间】:2011-11-25 18:29:05
【问题描述】:
如果我有一个类的头文件,如下所示:
class arrayStack
{
private:
struct StackNode
{
StackNode(int p, int v):previous(p),value(v){}
~StackNode(){std::cout<<"destructor calledn"<<std::endl;}
int previous;
int value;
};
public:
static const int STACKSIZE=100;
static const int NUMSTACK=3;
static int indexUsed;
arrayStack();
~arrayStack();
void push(int stackNum, int val);
int top(int stackNum);
void pop(int stackNum);
bool isEmpty(int stackNum);
vector<StackNode*> buffer;
int stackPointer[NUMSTACK];
};
这是cpp文件的内容:
void arrayStack::push(int stackNum, int val)
{
int lastIdx=stackPointer[stackNum];
stackPointer[stackNum]=indexUsed;
indexUsed++;
buffer[stackPointer[stackNum]]=new StackNode(lastIdx,val);
}
int arrayStack::top(int stackNum)
{
return buffer[stackPointer[stackNum]]->value;
}
基本上,我知道我需要将 STACKSIZE*NUMSTACK StackNode* 存储在向量缓冲区中(我知道我在这里只使用了一个数组)。现在,我想知道如何在 ctor 中为缓冲区保留足够大的空间。
这是我尝试过的:
buffer.reserve(STACKSIZE*NUMSTACK*sizeof(StackNode*))
但它似乎不起作用,因为在客户端代码中,当我尝试时:
arrayStack tStack;
for(int i=0;i<3;i++)
for(int j=0; j<10;j++)
{
tStack.push(i,i+j);
}
由于下标向量分配,程序崩溃。
【问题讨论】:
-
push是什么?此外,reserve 采用元素的数量,而不是内存量(以字节为单位),因此您预留了太多。 -
为什么需要将指针存储在 std::vector 中?请注意,为容器保留内存并不意味着您要构建那么多元素,它只是预先分配的内存。