访问冲突(未处理的异常)

时间:2013-09-04 21:53:17

标签: c++ visual-studio stack access-violation

所以我一直在关注用C ++ (here)创建堆栈的教程,我相信我已经将他的代码行复制到了行中,但我仍然遇到这个未处理的异常错误。我认为它与指针有关,但在搜索我的程序后,我无法识别任何被不恰当访问的指针。确切的错误消息是:“Project50.exe中0x00D45446处的未处理异常:0xC0000005:访问冲突读取位置0x00000014。”程序输出是第4次推送,但没有前三次(屏幕上显示的内容,除了空格应该是虚线,但这会导致帖子格式化为粗体):

名称:水 价值:3

膨化

名称:

我正在使用visual studio 2012,而本教程的人正在使用Netbeans IDE。这可能是权限问题吗?

标题文件:

#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

class Stack {
private:
    struct item {
    string name;
    int value;
    item* prev;
    };
    item* stackPtr;
public:
    void Push(string name, int value);
    void Pop();
    void ReadItem(item* r);
    void Print();

    Stack();
    ~Stack();
};

堆栈实现:

#include "Header.h"

using namespace std;

Stack::Stack() {
    stackPtr = NULL;

}

Stack::~Stack() {
    item* p1;
    item* p2;

    p1 = stackPtr;
    while( p1 != NULL) {
        p2 = p1;
        p1 ->prev;
        p2->prev = NULL; // Not actually necessary, but distinguishes that p1 and p2 are pointing to different things
        delete p2;
    }

}

void Stack::Push(string name, int value) {
    item* n = new item;

    n->name = name;
    n->value = value;

    if(stackPtr = NULL) {     // For first item of the stack
        stackPtr = n;
        stackPtr->prev = NULL;  // So that the item at the bottom of the stack points to null 
    }
    else {
        n->prev = stackPtr;
        stackPtr = n;
    }
}

void Stack::ReadItem(item* r) {
    cout << "-------------------------\n";
    cout << "name: " << r->name << endl;
    cout << "value: " << r->value << endl;
    cout << "-------------------------\n";
}

void Stack::Pop() {

    if(stackPtr = NULL) {
        cout << "There is nothing on the stack\n";
    }
    else {
        item* p = stackPtr;
        ReadItem(p);
        stackPtr = stackPtr->prev;
        p->prev = NULL; // Again, like the one in the destructor, not actually necessary.
        delete p;
    }
}

void Stack::Print() {

    item* p = stackPtr;

    while(p != NULL) {
        ReadItem(p);
        p = p->prev;
    }

}

主:

#include "Header.h"

using namespace std;

int main(int argc, char** argv) {
    Stack Dan;

    Dan.Push("Dan", 3);
    Dan.Push("Coffee", 1);
    Dan.Push("Donuts", 0);
    Dan.Push("Water", 3);
    Dan.Print();

    cout<< "Popping\n";
    Dan.Pop();
    cout<< "Popping\n";
    Dan.Pop();
    cout<< "Popping\n";
    Dan.Pop();
    cout<< "Popping\n";
    Dan.Pop();
    cout<< "Popping\n";
    Dan.Pop();

    cout << '\n';
    system("PAUSE");

    return 0;
}

2 个答案:

答案 0 :(得分:2)

这里有一个错误:

void Stack::Pop() {
    if(stackPtr = NULL) {
                ^
                 this should be ==

Stack::Push中的相同错误。

在析构函数中:

Stack::~Stack() {
   item* p1;
   item* p2;

   p1 = stackPtr;
   while( p1 != NULL) {
      p2 = p1;
      p1 ->prev;   // this statement does nothing

答案 1 :(得分:2)

  

我正在使用visual studio 2012,而本教程的人正在使用Netbeans IDE。这可能是权限问题吗?

不,这是教程人员的问题。

不要在YouTube上的教程中学习C ++。他们不能保证 - 不,非常不可能 - 准确无误。

代码混合===并违反了规则三,导致复制错误。还有其他错误和风格不佳的情况。