2017-02-01 69 views
-2

我的程序應該實現在C++ 一個線程堆棧我得到一個錯誤,當我要開始PROGRAMM:調試斷言失敗,向量下標越界

調試斷言失敗! ... \矢量線1201

表達:向量下標越界

我絕對不知道什麼是錯

#include <condition_variable> 
#include <iostream> 
#include <memory> 
#include <mutex> 
#include <thread> 
#include <vector> 

#define NUM_ELEMENTS 10 

using namespace std; 

class Stack 
{ 
protected: 
    vector<int> stack; 
    int topOfStack;  
    int maxSize; 
    mutable mutex _mutex; 
    mutable condition_variable cv; 

public: 
    Stack(int size); 
    int top() const; 
    int pop(); 
    void push(int element); 

    bool isFull() const; 
    bool isEmpty() const; 
}; 

Stack::Stack(int size) 
{ 
    stack.reserve(size); 
    maxSize = size;  
    topOfStack = 0; 
} 

int Stack::top() const 
{ 
    unique_lock<mutex> lck(_mutex);  

    // sperren, solange kein Wert da ist 
    while (isEmpty()) 
     cv.wait(lck); 

    int val = stack[topOfStack - 1]; 

    return val; 
} 

int Stack::pop() 
{ 
    // Kritischer Bereich - sperren 
    unique_lock<mutex> lck(_mutex); 

    // sperren, solange kein Wert am Stack ist 
    while (isEmpty()) 
     cv.wait(lck); 

    // Wert zwischenspeichern und Stack-Pointer -1 
    // danach werden wartende Threads benachrichtigt 
    topOfStack--; 
    int val = stack[topOfStack]; 
    cv.notify_all(); 

    return val; 
} 
void Stack::push(int element) 
{ 
    // Kritischer Bereich - sperren 
    unique_lock<mutex> lck(_mutex); 

    // sperren, solange der Stack voll ist 
    while (isFull()) 
     cv.wait(lck); 

    // Wert speichern und Stack-Pointer +1 
    // danach werden wartende Threads benachrichtigt 
    stack[topOfStack] = element; 
    topOfStack++; 
    cv.notify_all(); 
} 
bool Stack::isEmpty() const 
{ 
    return topOfStack == 0; 
} 
bool Stack::isFull() const 
{ 
    return topOfStack == maxSize; 
} 

// PRODUCER 
class Producer 
{ 
protected: 
    shared_ptr<Stack> stack; 

public: 
    Producer(shared_ptr<Stack> stack); 

    void produce(size_t amount); 
}; 

//CONSUMER 
class Consumer 
{ 
protected: 
    shared_ptr<Stack> stack; 

public: 
    Consumer(shared_ptr<Stack> stack); 

    void consume(size_t amount); 
}; 

Producer::Producer(shared_ptr<Stack> stack) 
    : stack(stack) 
{} 
void Producer::produce(size_t amount) 
{ 
    for (size_t i = 0; i < amount; i++) 
    { 
     cout << "Produce: " << i << endl; 
     stack->push(i); 
    } 
} 

Consumer::Consumer(shared_ptr<Stack> stack) 
    : stack(stack) 
{} 
void Consumer::consume(size_t amount) 
{ 
    for (size_t i = 0; i < amount; i++) 
    { 
     cout << "Consume: " << stack->pop() << endl; 
    } 
} 

// //////////////////////////////////////////////////////////////////////////// 

int main() 
{ 
    shared_ptr<Stack> stack(new Stack(3)); 

    Producer producer(stack); 
    Consumer consumer(stack); 

    thread consumerThread(&Consumer::consume, &consumer, NUM_ELEMENTS); 
    thread producerThread(&Producer::produce, &producer, NUM_ELEMENTS); 

    consumerThread.join(); 
    producerThread.join(); 

    return 0; 
} 
+0

請編輯您的問題以提供[mcve]。 –

+0

使用一個調試器並將您的樣本剝下,直到它成爲[mcve]。 –

+2

*我絕對不知道代碼有什麼問題* - 錯誤很明顯地向您說明問題所在。您正在訪問該向量中項目數超出範圍的向量元素。 – PaulMcKenzie

回答

0

vector<int> stack件與大小0創建的代碼並永遠保持該尺寸0。我沒有看到任何嘗試在您的代碼中更改它的大小。難怪對stack的任何索引訪問都會產生未定義的行爲,包括此「超出範圍」錯誤。

提示:如果要更改std::vector的大小,則相應的方法稱爲resize,而不是reserve。後者改變容量,而不是大小的矢量的